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ù)類型名稱的對照
