【Android】JNI靜態(tài)與動(dòng)態(tài)注冊(cè)介紹_環(huán)球看熱訊
點(diǎn)擊關(guān)注,與你共同成長!
【Android】JNI靜態(tài)與動(dòng)態(tài)注冊(cè)介紹
JNI的兩種注冊(cè)機(jī)制:靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè).
(資料圖片僅供參考)
JNI介紹JNI(Java Native Interface),即Java本地接口,JNI是Java調(diào)用Native 語言的一種特性。通過JNI可以使得Java與C/C++機(jī)型交互.
方式:
靜態(tài)注冊(cè)動(dòng)態(tài)注冊(cè):需要提供Java中Native方法的方法簽名和Native層中對(duì)應(yīng)的實(shí)現(xiàn)函數(shù)。靜態(tài)注冊(cè)要求C/C++層的函數(shù)名符合某種特定的要求:包含Java中Native方法的目錄信息和方法名。
ExampleJava
packagecn.com.codingce.ndkpractice;publicnativeStringstringFromJNI();
C++
extern"C"JNIEXPORTjstringJNICALLJava_cn_com_codingce_ndkpractice_MainActivity_stringFromJNI(JNIEnv*env,jobjectthiz){std::stringhello="HellofromC++";//crashTest();returnenv->NewStringUTF(hello.c_str());}
按照以上規(guī)則進(jìn)行命名,在調(diào)用到Native的方法時(shí),JVM會(huì)去查找是否存在對(duì)應(yīng)函數(shù)名的函數(shù),以此實(shí)現(xiàn)靜態(tài)注冊(cè)。
動(dòng)態(tài)注冊(cè)動(dòng)態(tài)注冊(cè)相對(duì)于靜態(tài)注冊(cè),優(yōu)點(diǎn)是不再根據(jù)特定路徑查找函數(shù)的實(shí)現(xiàn),帶來兩個(gè)好處:
沒有了冗雜的函數(shù)名,適用于大型項(xiàng)目開發(fā)。由于不再根據(jù)Native函數(shù)查找對(duì)應(yīng)的JNI層函數(shù),所以首次調(diào)用速度比靜態(tài)注冊(cè)快。開發(fā)者需要自行提供Java層和C/C++層中的映射關(guān)系。
一種可行的方法是基于JNI重載JNI_OnLoad(),在其中對(duì)函數(shù)進(jìn)行動(dòng)態(tài)注冊(cè)。
ExampleJava
packagecn.com.codingce.ndkpractice.utils;publicstaticnativevoidlogInit(StringlogFilePath,StringlogName,intlogfileLevel,intlogScreenLevel);
C++
此步驟涉及到如何獲取Java函數(shù)。
staticJNINativeMethodnativeUtilsMethods[]={{"logInit","(Ljava/lang/String;Ljava/lang/String;II)V",(void*)localLogInit},{"logJni","(ILjava/lang/String;)V",(void*)logJni},{"logClose","()V",(void*)logClose},};staticvoidnativeLogUtilsRegisterNatives(JNIEnv*jniEnv){if(jniEnv==nullptr){return;}jclassclazz=nullptr;do{clazz=jniEnv->FindClass("cn/com/codingce/ndkpractice/utils/LogUtils");if(clazz==nullptr){diagnosis_assert(!"FindClassLogUtilserror!");break;}if(jniEnv->RegisterNatives(clazz,nativeUtilsMethods,std::extent::value)!=0){diagnosis_assert(!"RegisterNativeserror!");break;}}while(false);if(jniEnv->ExceptionCheck()==JNI_TRUE){jniEnv->ExceptionClear();}if(clazz!=nullptr){jniEnv->DeleteLocalRef(clazz);}}
重載JNI_OnLoad函數(shù),并在其中調(diào)用nativeLogUtilsRegisterNatives函數(shù)
JNIEXPORTjintJNICALLJNI_OnLoad(JavaVM*vm,void*reserved){JNIEnv*jniEnv{nullptr};if(vm->GetEnv((void**)&jniEnv,JNI_VERSION_1_6)!=JNI_OK){diagnosis_assert(!"JNIversionerror!");returnJNI_EVERSION;}nativeLogUtilsRegisterNatives(jniEnv);returnJNI_VERSION_1_6;}
更多內(nèi)容:
Github:https://github.com/xzMhehe
Gitee:https://gitee.com/codingce
【C++】STL梳理
【NDK】封裝日志庫
【C++】PK游戲(玩轉(zhuǎn)多態(tài))
以上,便是今天的分享,希望大家喜歡,覺得內(nèi)容不錯(cuò)的,歡迎「分享」「贊」或者點(diǎn)擊「在看」支持,謝謝各位。
關(guān)鍵詞: 本地接口 大型項(xiàng)目 是否存在
相關(guān)閱讀
-
【Android】JNI靜態(tài)與動(dòng)態(tài)注冊(cè)介紹_環(huán)球看熱訊
點(diǎn)擊關(guān)注,與你共同成長!【Android】JNI靜態(tài)與動(dòng)態(tài)注冊(cè)介紹JNI的兩... -
世界熱推薦:今晚7:00直播丨下一個(gè)突破...
今晚19:00,Cocos視頻號(hào)直播馬上點(diǎn)擊【預(yù)約】啦↓↓↓在運(yùn)營了三年... -
NFT周刊|Magic Eden宣布支持Polygon網(wǎng)...
Block-986在NFT這樣的市場(chǎng),每周都會(huì)有相當(dāng)多項(xiàng)目起起伏伏。在過去... -
環(huán)球今亮點(diǎn)!頭條觀察 | DeFi的興衰與...
在比特幣得到機(jī)構(gòu)關(guān)注之后,許多財(cái)務(wù)專家預(yù)測(cè)世界將因?yàn)榧用茇泿诺?.. -
重新審視合作,體育Crypto的可靠關(guān)系才能雙贏
Block-987即使在體育Crypto領(lǐng)域,人們的目光仍然集中在FTX上。隨著... -
簡訊:前端單元測(cè)試,更進(jìn)一步
前端測(cè)試@2022如果從2014年Jest的第一個(gè)版本發(fā)布開始計(jì)算,前端開發(fā)...