JAVA JNI函數(shù)的注冊(cè)過程詳細(xì)介紹
JAVA JNI函數(shù)的注冊(cè)過程詳細(xì)介紹
我們?cè)趈ava中調(diào)用Native code的時(shí)候,一般是通過JNI來實(shí)現(xiàn)的,我們只需要在java類中加載本地.so庫文件,并聲明native方法,然后在需要調(diào)用的地方調(diào)用即可,至于java中native方法的具體實(shí)現(xiàn),全部交給了Native層。我們要在java中正確地調(diào)用到本地代碼中對(duì)應(yīng)函數(shù)的前提是什么呢?答案就是通過一定的機(jī)制建立java中native方法和本地代碼中函數(shù)的一一對(duì)應(yīng)關(guān)系,那么這種機(jī)制是什么呢?就是JNI函數(shù)的注冊(cè)機(jī)制。
JNI函數(shù)的注冊(cè)有兩種方式,一種是靜態(tài)注冊(cè)方式,另一種是動(dòng)態(tài)注冊(cè)方式。下面我們來分別介紹這兩實(shí)現(xiàn)方式。
一.靜態(tài)注冊(cè)。
1.實(shí)現(xiàn)原理:根據(jù)函數(shù)名來建立java方法和JNI函數(shù)間的一一對(duì)應(yīng)關(guān)系。
2.實(shí)現(xiàn)過程:
?、倬帉慾ava代碼;
?、诰幾gjava代碼,生成.class文件;
③用過javah指令,利用生成的.class文件生成JNI的.h文件;
④生成后的JNI頭文件中包含了Java函數(shù)在JNI層的聲明;
3.弊端:
?、贂鴮懞懿环奖?,因?yàn)镴NI層函數(shù)的名字必須遵循特定的格式,且名字特別長;
?、跁?huì)導(dǎo)致程序員的工作量很大,因?yàn)楸仨殲樗新暶髁薾ative函數(shù)的java類編寫JNI頭文件;
③程序運(yùn)行效率低,因?yàn)槌醮握{(diào)用native函數(shù)時(shí)需要根據(jù)根據(jù)函數(shù)名在JNI層中搜索對(duì)應(yīng)的本地函數(shù),然后建立對(duì)應(yīng)關(guān)系,這個(gè)過程比較耗時(shí)。
二.動(dòng)態(tài)注冊(cè)。
1.實(shí)現(xiàn)原理:直接告訴native函數(shù)其在JNI中對(duì)應(yīng)函數(shù)的指針;
2.實(shí)現(xiàn)過程:
?、倮媒Y(jié)構(gòu)體JNINativeMethod保存Java Native函數(shù)和JNI函數(shù)的對(duì)應(yīng)關(guān)系;
?、谠谝粋€(gè)JNINativeMethod數(shù)組中保存所有native函數(shù)和JNI函數(shù)的對(duì)應(yīng)關(guān)系;
?、墼贘ava中通過System.loadLibrary加載完JNI動(dòng)態(tài)庫之后,調(diào)用JNI_OnLoad函數(shù),開始動(dòng)態(tài)注冊(cè);
?、躂NI_OnLoad中會(huì)調(diào)用AndroidRuntime::registerNativeMethods函數(shù)進(jìn)行函數(shù)注冊(cè);
?、軦ndroidRuntime::registerNativeMethods中最終調(diào)用jniRegisterNativeMethods完成注冊(cè)。
3.優(yōu)點(diǎn):克服了靜態(tài)注冊(cè)的弊端。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Java通過JNI 調(diào)用動(dòng)態(tài)鏈接庫DLL操作
- java通過jni調(diào)用opencv處理圖像的方法
- Java通過調(diào)用C/C++實(shí)現(xiàn)的DLL動(dòng)態(tài)庫——JNI的方法
- JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼
- JAVA JNI原理詳細(xì)介紹及簡單實(shí)例代碼
- Java的JNI快速入門教程(推薦)
- 從源碼編譯Android系統(tǒng)的Java類庫和JNI動(dòng)態(tài)庫的方法
- 解析Java的JNI編程中的對(duì)象引用與內(nèi)存泄漏問題
- java jni調(diào)用c函數(shù)實(shí)例分享(java調(diào)用c函數(shù))
- 詳解JNI到底是什么
相關(guān)文章
如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值
這篇文章主要介紹了如何動(dòng)態(tài)修改JavaBean中注解的參數(shù)值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-02-02
Spring Boot 通過 Mvc 擴(kuò)展方便進(jìn)行貨幣單位轉(zhuǎn)換的代碼詳解
這篇文章主要介紹了Spring Boot 通過 Mvc 擴(kuò)展方便進(jìn)行貨幣單位轉(zhuǎn)換,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
SpringMVC 實(shí)現(xiàn)用戶登錄實(shí)例代碼
這篇文章主要介紹了SpringMVC 實(shí)現(xiàn)用戶登錄實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java中Map轉(zhuǎn)List及List轉(zhuǎn)Map的方法(簡單好用!)
這篇文章主要給大家介紹了關(guān)于Java中Map轉(zhuǎn)List及List轉(zhuǎn)Map的相關(guān)資料,可以使用Java 8的Stream API將Java Map轉(zhuǎn)換為List,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
基于SpringBoot實(shí)現(xiàn)上傳2種方法工程代碼實(shí)例
這篇文章主要介紹了基于SpringBoot實(shí)現(xiàn)上傳工程代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Spring boot集成spring session實(shí)現(xiàn)session共享的方法
這篇文章主要介紹了Spring boot集成spring session實(shí)現(xiàn)session共享的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06
springboot程序啟動(dòng)慢-未配置hostname的解決
這篇文章主要介紹了springboot程序啟動(dòng)慢-未配置hostname的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

