尤物视频网站_国产精品成人在亚洲_国产成人亚洲综合无码不卡精品_丁香五月香婷婷五月_亚洲成AV人片高潮喷水

您的位置:首頁 >聚焦 >

【Android】JNI靜態(tài)與動態(tài)注冊介紹_環(huán)球看熱訊

2022-12-02 18:41:55    來源:程序員客棧

點擊關注,與你共同成長!


【Android】JNI靜態(tài)與動態(tài)注冊介紹

JNI的兩種注冊機制:靜態(tài)注冊和動態(tài)注冊.


(資料圖片僅供參考)

JNI介紹

JNI(Java Native Interface),即Java本地接口,JNI是Java調用Native 語言的一種特性。通過JNI可以使得Java與C/C++機型交互.

方式:

靜態(tài)注冊動態(tài)注冊:需要提供Java中Native方法的方法簽名和Native層中對應的實現(xiàn)函數(shù)。靜態(tài)注冊

要求C/C++層的函數(shù)名符合某種特定的要求:包含Java中Native方法的目錄信息和方法名。

Example

Java

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ī)則進行命名,在調用到Native的方法時,JVM會去查找是否存在對應函數(shù)名的函數(shù),以此實現(xiàn)靜態(tài)注冊。

動態(tài)注冊

動態(tài)注冊相對于靜態(tài)注冊,優(yōu)點是不再根據特定路徑查找函數(shù)的實現(xiàn),帶來兩個好處:

沒有了冗雜的函數(shù)名,適用于大型項目開發(fā)。由于不再根據Native函數(shù)查找對應的JNI層函數(shù),所以首次調用速度比靜態(tài)注冊快。

開發(fā)者需要自行提供Java層和C/C++層中的映射關系。

一種可行的方法是基于JNI重載JNI_OnLoad(),在其中對函數(shù)進行動態(tài)注冊。

Example

Java

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ù),并在其中調用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;}

更多內容:

Github:https://github.com/xzMhehe

Gitee:https://gitee.com/codingce

【C++】STL梳理

【NDK】封裝日志庫

【C++】PK游戲(玩轉多態(tài))

以上,便是今天的分享,希望大家喜歡,覺得內容不錯的,歡迎「分享」「贊」或者點擊「在看」支持,謝謝各位。

關鍵詞: 本地接口 大型項目 是否存在

相關閱讀