- 相關推薦
JAVA JNI函數(shù)的注冊過程介紹
我們在java中調用Native code的時候,一般是通過JNI來實現(xiàn)的,我們只需要在java類中加載本地.so庫文件,并聲明native方法,然后在需要調用的地方調用即可,至于java中native方法的具體實現(xiàn),全部交給了Native層。我們要在java中正確地調用到本地代碼中對應函數(shù)的前提是什么呢?答案就是通過一定的機制建立java中native方法和本地代碼中函數(shù)的一一對應關系,那么這種機制是什么呢?就是JNI函數(shù)的注冊機制。
JNI函數(shù)的注冊有兩種方式,一種是靜態(tài)注冊方式,另一種是動態(tài)注冊方式。下面我們來分別介紹這兩實現(xiàn)方式。
一.靜態(tài)注冊。
1.實現(xiàn)原理:根據(jù)函數(shù)名來建立java方法和JNI函數(shù)間的一一對應關系。
2.實現(xiàn)過程:
①編寫java代碼;
、诰幾gjava代碼,生成.class文件;
、塾眠^javah指令,利用生成的.class文件生成JNI的.h文件;
④生成后的JNI頭文件中包含了Java函數(shù)在JNI層的聲明;
3.弊端:
①書寫很不方便,因為JNI層函數(shù)的名字必須遵循特定的格式,且名字特別長;
②會導致程序員的工作量很大,因為必須為所有聲明了native函數(shù)的java類編寫JNI頭文件;
③程序運行效率低,因為初次調用native函數(shù)時需要根據(jù)根據(jù)函數(shù)名在JNI層中搜索對應的本地函數(shù),然后建立對應關系,這個過程比較耗時。
二.動態(tài)注冊。
1.實現(xiàn)原理:直接告訴native函數(shù)其在JNI中對應函數(shù)的指針;
2.實現(xiàn)過程:
①利用結構體JNINativeMethod保存Java Native函數(shù)和JNI函數(shù)的對應關系;
、谠谝粋JNINativeMethod數(shù)組中保存所有native函數(shù)和JNI函數(shù)的對應關系;
、墼贘ava中通過System.loadLibrary加載完JNI動態(tài)庫之后,調用JNI_OnLoad函數(shù),開始動態(tài)注冊;
④JNI_OnLoad中會調用AndroidRuntime::registerNativeMethods函數(shù)進行函數(shù)注冊;
、軦ndroidRuntime::registerNativeMethods中最終調用jniRegisterNativeMethods完成注冊。
3.優(yōu)點:克服了靜態(tài)注冊的弊端。
【JAVA JNI函數(shù)的注冊過程介紹】相關文章:
Java中Jni調用DLL文件試驗07-22
JAVA中的main函數(shù)10-04
java構造函數(shù)調用技巧10-26
java調用c函數(shù)的實例09-16
java函數(shù)及運算符09-07
java回調函數(shù)詳解11-02
java函數(shù)使用方法07-18
Java面向過程教程10-05