您的位置:首页 >聚焦 >

【Android】JNI静态与动态注册介绍_环球看热讯

2022-12-02 18:41:55    来源:程序员客栈

点击关注,与你共同成长!


【Android】JNI静态与动态注册介绍

JNI的两种注册机制:静态注册和动态注册.


(资料图片仅供参考)

JNI介绍

JNI(Java Native Interface),即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互.

方式:

静态注册动态注册:需要提供Java中Native方法的方法签名和Native层中对应的实现函数。静态注册

要求C/C++层的函数名符合某种特定的要求:包含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());}

按照以上规则进行命名,在调用到Native的方法时,JVM会去查找是否存在对应函数名的函数,以此实现静态注册。

动态注册

动态注册相对于静态注册,优点是不再根据特定路径查找函数的实现,带来两个好处:

没有了冗杂的函数名,适用于大型项目开发。由于不再根据Native函数查找对应的JNI层函数,所以首次调用速度比静态注册快。

开发者需要自行提供Java层和C/C++层中的映射关系。

一种可行的方法是基于JNI重载JNI_OnLoad(),在其中对函数进行动态注册。

Example

Java

packagecn.com.codingce.ndkpractice.utils;publicstaticnativevoidlogInit(StringlogFilePath,StringlogName,intlogfileLevel,intlogScreenLevel);

C++

此步骤涉及到如何获取Java函数。

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函数,并在其中调用nativeLogUtilsRegisterNatives函数

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游戏(玩转多态)

以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎「分享」「赞」或者点击「在看」支持,谢谢各位。

关键词: 本地接口 大型项目 是否存在

相关阅读