jni

1、设置NDK

local.properties

ndk.dir=C:\Users\dong\AppData\Local\Android\Sdk\ndk-bundle
sdk.dir=C:\Users\dong\AppData\Local\Android\Sdk

2、创建JNI.java


package com.example.dong.ndkdemo;
public class JNI {
    {
        System.loadLibrary("hello");
    }
    // native 用于调用C对应的函数
    public  native String sayHello();
}

 

3、main下创建jni目录,创建文件Hello.c,Android.mk

Hello.c

#include <jni.h>
//方法名必须为本地方法的全类名点改为下划线,穿入的两个参数必须这样写,
//第一个参数为Java虚拟机的内存地址的二级指针,用于本地方法与java虚拟机在内存中交互
//第二个参数为一个java对象,即是哪个对象调用了这个 c方法
jstring Java_com_example_dong_ndkdemo_JNI_sayHello(JNIEnv* env,jobject obj){
    char* text="I from C";
    return (*env)->NewStringUTF(env,text);
}

Android.mk

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    #编译生成的文件的类库叫什么名字
    LOCAL_MODULE    := hello
    #要编译的c文件
    LOCAL_SRC_FILES := Hello.c
    include $(BUILD_SHARED_LIBRARY)

4、设置app/bulid.gradle

defaultConfig {
        ........
     ....... ndk{ moduleName "Hello"//so文件 app/build/intermediates/ndkBuild/debug/obj/local/{*}/libhello.so abiFilters "armeabi-v7a","arm64-v8a","x86","x86_64"//cpu类型arm、 mips "armeabi" } }
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}

5修改文件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String result=new JNI().sayHello();
        System.out.println("result=="+result);
    }
}

继续测试

1、File------New Module ----名称javaCallC

2、创建JNI.java

public class JNI {
    public native int add(int a,int b);
    public native String sayHello(String s);
    public native int[] increateArrayEles(int[] intArray);
    public native int checkPwd(String pwd);
}

3、生成头文件

在Terminal中进入切换至目录  javacallcsrcmainjni

执行javah com.example.javacallc.JNI

X:****javacallcsrcmainjava>javah com.example.javacallc.JNI     javah javac 不是内部或外部命令 解决方法 这是因为java10已经移除了javah的相关功能。

为了使用java 10生成头文件,在windows的cmd命令行中使用以下命令:

javacallcsrcmainjavacomexamplejavacallc>javac -h . JNI.java

这样就会生成com_example_javacallc_JNI.h 文件,将文件移动到jni目录

javah javac 不是内部或外部命令 解决方法

原文地址:https://www.cnblogs.com/mingjing/p/9792240.html