正文
-
在名称前面加上 Java_。
-
描述与顶级源目录相关的文件路径。
-
使用下划线代替正斜杠。
-
删掉 .java 文件扩展名。
-
在最后一个下划线后,附加函数名。
按照这些规则,此示例使用的函数名为
Java_com_example_hellojni_HelloJni_stringFromJNI
。 此名称描述
hellojni/src/com/example/hellojni/HelloJni.java
中一个名为 stringFromJNI()的 Java 函数。我们想通过更简单的方式,让写native函数如同和写java函数没有这一步的转化,那么可以通过javah来实现。
javah -d ../jni -jni com.chenjensen.myapplication.MainActivity
根据Javah生成的头文件,实现相应的native函数
JNIEXPORT jstring JNICALL Java_com_chenjensen_myapplication_MainActivity_helloWorld (JNIEnv *, jobject);
头文件中生成了我们的java文件中定义的native方法,也做好了类型转化,我们只需要新建一个cpp文件来实现相应的方法即可。
cpp文件
JNIEXPORT jstring JNICALL Java_com_chenjensen_myapplication_MainActivity_helloWorld (JNIEnv *env, jobject){ char *str = "Hello world"; return (*env).NewStringUTF(str);}
build文件中编译支持指定的平台(arm,x86等)
ndk { moduleName "hello" abiFilters "armeabi", "armeabi-v7a", "x86" }
这里指定了生成so文件的name之后,编译系统就会从JNI目录下去寻找相应的c/cpp文件,来生成相应的so文件。
执行
在Java代码中,native方法的执行之前,要提前加载相应的动态库,然后才可以执行,一般会在该类中通过静态代码块的方式来加载。应用启动时,调用此函数以加载 .so 文件。