2021年7月2日Android NDK使用JNI进行静态注册和动态注册

1.版本声明

androidStudio4.2.1

2.新建一个Native C++ 项目

3.静态注册:打开MainActivity可以看到有一个native声明的方法,对应的native-lib.cpp文件的方法:Java_全类名_方法名,这个默认就是JNI的静态注册。

4.动态注册:重写jni.h头文件中的JNI_OnLoad方法,这个方法会在动态链接库加载时自动调用

//动态注册
static JNINativeMethod methods[] = {
        {"stringFromJNI", "()Ljava/lang/String;", reinterpret_cast<void *>(getStr)}
};

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env = nullptr;
    vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6);
    jclass mainActivity = env->FindClass("com/example/myapplication/MainActivity");
    env->RegisterNatives(mainActivity, reinterpret_cast<const JNINativeMethod *>(&methods),
                         sizeof(methods) / sizeof(methods[0]));
    return JNI_VERSION_1_6;
}

主要用到的api:

4.1 jint GetEnv(void** env, jint version)

vm->GetEnv:通过JavaVM实例初始化JNIEnv实例,后续的操作都由JNIEnv实例来完成

4.2 jclass FindClass(const char* name)

env->FindClass:通过Java的全类名获取jclass对象

4.3 jint RegisterNatives(jclass clazz, const JNINativeMethod* methods,jint nMethods)

env->RegisterNatives:JNI动态注册核心api,调用此方法即可完成JNI的动态注册。可传入一个数组,并设置nMethods的值,指明需要注册的方法的数量

4.4关于动态注册的参数JNINativeMethod说明

typedef struct {
    const char* name;
    const char* signature;
    void*       fnPtr;
} JNINativeMethod;

结构体name属性为Java类中native修饰方法的方法名

结构体signature属性为Java类中native修饰方法的方法签名,可通过javap -s 查看编译好的calss文件获得

结构体signature属性为C++文件中需要跟Java绑定的函数名称,C++函数定义需包含两个固定参数functionName(JNIEnv *env, jobject object)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值