android 获取JNIEnv的几种方法.md

个人目前三种方法:

  • 通过JNI_OnLoad
  • 通过android::AndroidRuntime::getJNIEnv()
  • 通过dlopen和dlsym 拿到“android::AndroidRuntime::getJNIEnv()”函数指针然后调用该函数
    注意:第二种要对Ndk进行patch,github上搜索 ndk-patch 进行修改
    做个简单的实验:
JNIEnv*(*getAndroidRuntimeEnv)();
JNIEnv* dlsmgetenv() 
{
    void*runtime = dlopen("/system/lib/libandroid_runtime.so", RTLD_NOW);
    getAndroidRuntimeEnv= (JNIEnv*(*)())dlsym(runtime, "_ZN7android14AndroidRuntime9getJNIEnvEv");
    return getAndroidRuntimeEnv();
}
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    JNIEnv* env = NULL;
    if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK)
    {
        return -1;
    }
    JNIEnv* AndroidRuntimeenv = android::AndroidRuntime::getJNIEnv();
    JNIEnv* dlsymenv = dlsmgetenv();
    Messageprint::printinfo("JNI_OnLoad", "JNI_OnLoadenv %p AndroidRuntimeenv:%p dlsymenv:%p", env, AndroidRuntimeenv, dlsymenv);
  return JNI_VERSION_1_4;
}

打印结果:

 I/JNI_OnLoad: JNI_OnLoadenv 0xb9115830 AndroidRuntimeenv:0xb9115830 dlsymenv:0xb9115830

可以看到拿到的时同一个地址
多线程没测试,可能存在问题。

转载于:https://www.cnblogs.com/xiaobaiyey/p/5909443.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值