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)過程:
①編寫java代碼;
②編譯java代碼,生成.class文件;
③用過javah指令,利用生成的.class文件生成JNI的.h文件;
?、苌珊蟮腏NI頭文件中包含了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)過程:
①利用結(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è);
④JNI_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)文章
Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫操作詳解
JdbcTemplate是Spring框架自帶的對(duì)JDBC操作的封裝,目的是提供統(tǒng)一的模板方法使對(duì)數(shù)據(jù)庫的操作更加方便、友好,效率也不錯(cuò),這篇文章主要介紹了Spring JdbcTemplate執(zhí)行數(shù)據(jù)庫操作,需要的朋友可以參考下2022-10-10
Spring?Task任務(wù)調(diào)度的實(shí)現(xiàn)示例
本文主要介紹了Spring?Task任務(wù)調(diào)度的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
空指針HttpSession異常之SpringBoot集成WebSocket的方法
文章介紹了在Spring?Boot中集成WebSocket時(shí)遇到的HttpSession為空的問題,并探討了三種解決方法,方法一涉及域名配置,方法二通過監(jiān)聽創(chuàng)建Session,而方法三是從request中獲取session并存入數(shù)據(jù),感興趣的朋友一起看看吧2025-01-01
springboot加載配值文件的實(shí)現(xiàn)步驟
本文主要介紹了springboot加載配值文件的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03
Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))
這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Spring Boot 項(xiàng)目中整合 MyBatis 和 PageHel
這篇文章主要介紹了Spring Boot 項(xiàng)目中整合 MyBatis 和 PageHelper的操作步驟,整合 PageHelper 到 Spring Boot 項(xiàng)目中主要包括添加依賴、配置數(shù)據(jù)源與 MyBatis、配置 PageHelper 以及在業(yè)務(wù)邏輯中使用 PageHelper 進(jìn)行分頁查詢,需要的朋友可以參考下2024-04-04
Springboot ApplicationRunner的使用解讀
這篇文章主要介紹了Springboot ApplicationRunner的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法,分享一個(gè)文件編碼轉(zhuǎn)換的工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

