標籤:jni android native
當java層調用聲明的native函數時,他會從對應的so庫中尋找對應的c或c++函數,如果找不到就報錯,如果找到就為這個函數和java聲明的native建立一個聯絡,其實就是儲存jni層函數的指標。以後再次調用java中聲明的native函數時直接使用這個函數指標就可以了。從這裡可以看出靜態方法就是根據函數名來建立java函數和jni函數之間的關聯關係,而且要求jni層函數的名字必須遵循特定的格式。 動態註冊:用JNINativeMethod結構體儲存java native函數和jni函數的一一對應關係 JNINativeMethod定義如下typedef struct{const char* name;//java中native函數的名字(不用攜帶包名)const char* signature; //java函數的簽名資訊,用字串表示void* fnptr;//jni層對應函數的函數指標}JNINativeMethod;應該如何使用這個結構體呢?來看MediaScanner JNI層是如何做的static JNINativeMethod gMethod[]={....{“processFile” //java中native層函數的函數名“(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V”,//processFile的簽名資訊(void*) android_media_MediaScanner_processFile//jni層對應的函數指標},...{"native_init","()V";(void*) android_media_MediaScanner_native_init},};//註冊JNINativeMethod數組int register_android_media_MediaScanner(JNIEnv* env){ //"android/media/MediaScanner" 表明java中哪個類return AndroidRuntime::registerNativeMethods( env, "android/media/MediaScanner" , gMethods ,NELEM(gMethods) );}動態註冊函數調用時機當java層通過System.loadLibrary載入完jni動態庫後,緊接著會尋找該庫中一個叫JNI_OnLoad的函數,如果有就調用它,而動態註冊的工作就是在這裡完成的。例:jint JNI_OnLoad(JavaVm* vm, void* reserved){JNIEnv* env=NULL;jint result=-1;if( vm->GetEnv( (void**) &env,JNI_VERSION_1_4 ) != JNI_OK ){goto bail;}if( register_android_media_MediaScanner(env ) < 0 )goto bail;return JNI_VERSION_1_4 ; //必須返回這個值,否則會報錯}
摘自 深入理解安卓I
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
jni動態註冊