NDK动态注册

7 篇文章 0 订阅

关于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;
}

其实动态注册就是上面描述的这样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值