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);