jni動態註冊

來源:互聯網
上載者:User

標籤: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動態註冊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.