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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章