Android 动态注册 JNI 函数

在安卓开发中,JNI(Java Native Interface)是用于在 Java 代码和本地(C/C++)代码之间进行交互的桥梁。通常情况下,JNI函数是通过静态注册的方式将本地函数映射到Java层。


直接新开一个 C++ 工程后是一个静态注册函数,接下来就在cpp文件中修改:

/**
 * 真正执行的JNI函数
 * 注:在C++中要先定义后引用,若先引用后定义则会编译报错
 */
jstring actionKang(JNIEnv *env, jobject thiz) {
    std::string str = "我的动态注册的函数";
    return env->NewStringUTF(str.c_str());
}

/**
 * 动态注册的函数集合
 * 第一个参数:Java中的native方法名
 * 第二个参数:传参和返回值类型
 * 第三个参数:native方法所对应的JNI函数
 */
static JNINativeMethod methods[] = {
        {"stringFromJNI", "()Ljava/lang/String;", (void *) actionKang}
};

/**
 * 在Java中调用
 * { System.loadLibrary("此文件生成的so库名"); }
 * 时会触发 JNI_OnLoad 函数
 */
jint JNI_OnLoad(JavaVM *vm, void *args) {
    JNIEnv *env;
    // 获取env,若获取不到则抛出异常
    if (vm->GetEnv((void **) (&env), JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }
    // 调用JNI的类
    jclass mainActivityClass = env->FindClass("com/example/jnidemo/MainActivity");
    env->RegisterNatives(mainActivityClass, methods, sizeof(methods) / sizeof(methods[0]));

    return JNI_VERSION_1_6;
}

这样子就是动态注册的函数了

动态注册 JNI 函数有其一些好处:

1、灵活性:动态注册允许在运行时动态地注册和注销 JNI 函数。这使得你可以根据应用程序的需求在特定的时刻注册或注销函数,而无需事先定义全部的 JNI 函数。这种灵活性对于动态扩展和模块化设计非常有用。

2、减少内存占用:静态注册要求在应用程序启动时注册所有的 JNI 函数。对于大型应用程序或包含大量JNI函数的应用程序来说,这可能会导致内存占用的增加。而动态注册允许按需注册函数,从而减少了不必要的内存开销。

3、混淆保护:通过动态注册 JNI 函数,可以在本地代码中使用一些技术来隐藏函数的名称和实现细节。这对于保护代码免受逆向工程和代码盗用的威胁很有帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值