Android JNI开发系列:第一章 JNIEnv接口指针
Android JNI开发系列:第三章 对引用数据类型的操作
Android JNI开发系列:第八章 POSIX Socket API 面向连接的通信
Android JNI开发系列:第九章 POSIX Socket API 无连接的通信
Android JNI开发系列:第十章 POSIX Socket API 本地通信
原生代码通过JNIEnv接口指针提供的各种函数来使用虚拟机的功能。JNIEnv是一个指向线程-局部数据的指针,而线程-局部数据中包含指向函数表的指针。
注:JNIEnv接口指针在同一个线程中有效,但不能在其他线程中共同使用,否则会出现很多未知问题。
1 原生代码C与C++使用JNIEnv的区别
原生代码时C与原生代码C++,两种语言在JNI函数的调用上有所不同。
C代码中,JNIEnv时指向JNINativeInterface结构的指针,为了访问任何一个JNI函数,该指针需要首先被解引用。
return (*env)->NewStringUTF(env, "Hello from JNI!");
C++代码中,JNIEnv实际上时C++类实例,JNI函数以成员函数的形式存在。因为JNI方法已经访问了当前的JNI环境,因此JNI方法调用不要求JNIEnv实例作参数。
return env->NewStringUTF("Hello from JNI!");
2 实例方法与静态方法
Java程序设计语言有两类方法:实例方法和静态方法(实例方法就是需要创建对象后才能调用的对象的方法,静态方法就是直接用类访问的方法)。两种方法均可以声明为原生的,可以通过JNI技术以原生代码的形式提供它们的实现。
Java中的实例方法在JNI中通过第二个参数jobject获取实例引用:
JNIEXPORT
jstring JNICALL Java_com_example_jni_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz);
Java中的静态方法在JNI中通过第二个参数jclass获取类引用:
JNIEXPORT
jstring JNICALL Java_com_example_jni_MainActivity_stringFromJNI(JNIEnv* env, jclass clazz);