Android JNI开发系列:第一章 JNIEnv接口指针

Android JNI开发系列:第一章 JNIEnv接口指针

Android JNI开发系列:第二章 数据类型

Android JNI开发系列:第三章 对引用数据类型的操作

Android JNI开发系列:第四章 异常处理

Android JNI开发系列:第五章 局部和全局引用

Android JNI开发系列:第六章 线程

Android JNI开发系列:第七章 POSIX线程

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);
发布了199 篇原创文章 · 获赞 7 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章