仍然从hello-jni开始。
JNI (Java Native Interface)Java原生接口技术实现java应用程序和原生代码间的通信
声明原生方法 :
`public native String stringFromJNI();`
在共享库中载入原生模块:
java.lang.System类提供了两个静态方法,load和loadlibrary用于在运行时加载共享库
```
static{
System.loadLibrary("hello-jni");
}
```
Android上的Java库路径包含/vendor/lib和/system/lib,loadLibrary在扫描库路径
时,一旦发现同名的库,立即加载共享库。因为Java库路径的第一组目录是Android
系统目录,为了避免与系统库命名冲突,建议为每个共享库选唯一的名字。
在C/C++中实现原生方法
#include <string.h>
#include <jni.h>
...
Jstring
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv * env,
jobject thiz)
{
return (*env)->NewStringUTF(env,"Hello from JNI!");
}
Java_com_example_hellojni_HelloJni_stringFromJNI包括包名+类名+函数名
这么复杂的名字可以由javah工具来自动生成
方法声明
Jstring
Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv * env,
jobject thiz)
第一个参数JNIEnv是指向可用JNI函数表的接口指针;第二个参数jobject是HelloJni
类实例的java对象引用。
-- JNI标准规范: 遵守JNI标准规函数命名方式, JNI中方法命名为 Java_包
名_类名_方法名 , 可以使用javah生成签名头文件, 靠这种方式实现
Native方法 与 JNI方法之间的映射关系, 即应用直接与框架层进行交互,
这种规范常用与应用开发;
C语言方法命名JNI接口规则 : Java_完整包名类名_方法名(JNIEnv *env, jobject thiz), 注意完整的类名包名中包名的点要用 _ 代替;