安卓JNI總結(jié)

jvm將硬件、操作系統(tǒng)底層和應(yīng)用層隔離開來,使得java成為了一種跨平臺語音。java開發(fā)人員不需要關(guān)心硬件和操作系統(tǒng)的差異,jvm自動將class文件翻譯成適合的機器語言。
與此同時,很多優(yōu)秀的庫,或者操作系統(tǒng)如Linux,是由C/C++編寫的,如果能使用java調(diào)用這些庫,將會提高開發(fā)效率。jni就是java和C/C++代碼之間的橋梁。通過JNI,java可以調(diào)用C/C++代碼。

安卓中JNI的使用方法

1.創(chuàng)建java的native函數(shù)。
2.使用javah自動生成對應(yīng)的jni函數(shù)。
3.在生成的jni函數(shù)中實現(xiàn)邏輯,如調(diào)用C/C++方法,或者調(diào)用java方法。
4.使用Android.mk、Application.mk將jni函數(shù)打包成.so庫。
5.在java程序中加載.so庫,使用native函數(shù)。

JNI中調(diào)用java方法

1.使用JNIEnv->FindClass("java類名")獲取java類
2.使用JNIEnv->GetMethodId("獲取到的java類","方法名","方法簽名");獲取java方法
3.使用env->CallVoidMethod(jobject,"獲取的java方法","輸入?yún)?shù)");調(diào)用java方法

JNI中JNIEnv的意義

JNIEnv是一個指針,指向jvm中保存的JNI函數(shù)表。通過JNIEnv可以調(diào)用JNI函數(shù)。JNIEnv是線程私有的,每個線程有獨自的JNIEnv。通過JavaVM->GetEnv()可以獲得本線程的JNIEnv。

JNI中的變量聲明周期

JNI中變量有三種聲明周期
1.局部引用(Local Reference)
在所創(chuàng)建的native函數(shù)中有效,在函數(shù)結(jié)束時結(jié)束聲明周期(可以被GC)。
2.全局引用(Global Reference)
可以跨方法,跨線程使用,在主動釋放之前不能被GC。
3.弱全局引用(Weak Global Reference)
可以跨方法,跨線程使用,不釋放也可能被GC。

JNI多線程

JNI線程用到的13三個函數(shù)

1、pthread_t :用于聲明一個線程對象如:pthread_t thread;

2、pthread_creat :用于創(chuàng)建一個實際的線程如:pthread_create(&pthread,NULL,threadCallBack,NULL);其總共接收4個參數(shù),第一個參數(shù)為pthread_t對象,第二個參數(shù)為線程的一些屬性我們一般傳NULL就行,第三個參數(shù)為線程執(zhí)行的函數(shù)( void* threadCallBack(void *data) ),第四個參數(shù)是傳遞給線程的參數(shù)是void*類型的既可以傳任意類型。

3、pthread_exit :用于退出線程如:pthread_exit(&thread),參數(shù)也可以傳NULL。注:線程回調(diào)函數(shù)最后必須調(diào)用此方法,不然APP會退出(掛掉)。

4、pthread_mutex_t :用于創(chuàng)建線程鎖對象如:pthread_mutex_t mutex;

5、pthread_mutex_init :用于初始化pthread_mutex_t鎖對象如:pthread_mutex_init(&mutex, NULL);

6、pthread_mutex_destroy :用于銷毀pthread_mutex_t鎖對象如:pthread_mutex_destroy(&mutex);

7、pthread_cond_t :用于創(chuàng)建線程條件對象如:pthread_cond_t cond;

8、pthread_cond_init :用于初始化pthread_cond_t條件對象如:pthread_cond_init(&cond, NULL);

9、pthread_cond_destroy :用于銷毀pthread_cond_t條件對象如:pthread_cond_destroy(&cond);

10、pthread_mutex_lock :用于上鎖mutex,本線程上鎖后的其他變量是不能被別的線程操作的如:pthread_mutex_lock(&mutex);

11、pthread_mutex_unlock :用于解鎖mutex,解鎖后的其他變量可以被其他線程操作如:pthread_mutex_unlock(&mutex);

12、pthread_cond_signal :用于發(fā)出條件信號如:pthread_cond_signal(&mutex, &cond);

13、pthread_cond_wait :用于線程阻塞等待,直到pthread_cond_signal發(fā)出條件信號后才執(zhí)行退出線程阻塞執(zhí)行后面的操作。

JNI中線程需要使用JNIEnv的使用,需要調(diào)用(*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL),將自身綁定到JVM中。

java和jni之間基本數(shù)據(jù)類型名稱的對照

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容