NDK动态注册
关于NDK想必大家都了解一点如
静态注册
//动态注册
public native void registerJava01(String text);
这是一个最基本的Native
函数
那么我们之前采用的静态注册就是在c/c++文件中填写
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myndk_MainActivity_registerJava01(){}
那么这就是一种静态注册,也就是名字是组合得来的,但是当我们看有些源码的时候我们发现并不是这样的,其实他们就采用了静态注册的方法来注册的。
动态注册
所谓的动态注册就是不需要一个方法名一个方法名的形式去写,只需要写一个就行,开始吧:
动态注册需要实现这个方法
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * javaVm,void * pVoid){}
怎么理解这个方法呢,可以想成Aactivity中的onCreate这个方法,当
MainActivity
一加载的时候,就会调用这个方法。
//虚拟机
JavaVM * jvm;
void register01(JNIEnv *env,jobject instance,jstring text)
{
const char* textValue = env->GetStringUTFChars(text,NULL);
__android_log_print(ANDROID_LOG_DEBUG,"hongbiao","动态注册的函数:%s",textValue);
env->ReleaseStringUTFChars(text,textValue);
}
//因为注册的那个方法需要这个结构体,所以需要创建
/**
* typedef struct {
const char* name; 对应java中的方法名
const char* signature; 编码描述
void* fnPtr;可以理解为接受的函数,数据将会传到这个函数里面来
} JNINativeMethod;
*/
RegisterNatives static const JNINativeMethod jniNativeMethod[] =
{
//这是一个数组,将需要进行动态注册方法放到这里面来
{"registerJava01","(Ljava/lang/String;)V",(void *)(register01)}
};
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * javaVm,void * pVoid){
::jvm = javaVm;
JNIEnv* jniEnv = nullptr;
//通过虚拟机,创建全新的evn
jint result = javaVm->GetEnv(reinterpret_cast<void **>(&jniEnv),
JNI_VERSION_1_6);
if(result!=JNI_OK){
return -1;
}
const char * mainActivityClassStr = "com/example/myndk/MainActivity";
jclass mainActivity = jniEnv->FindClass(mainActivityClassStr);
//在哪里动态注册
jniEnv->RegisterNatives(mainActivity,
jniNativeMethod,
//下面两个主要是进行个数的计算
sizeof(jniNativeMethod)/ sizeof(JNINativeMethod));
return JNI_VERSION_1_6;
}
其实动态注册就是上面描述的这样
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)