您好,欢迎来到伴沃教育。
搜索
您的当前位置:首页0x03 多线程使用JNIEnv指针

0x03 多线程使用JNIEnv指针

来源:伴沃教育

JNIEnv因线程不同而不同,不能直接 globalRef 或者 static extern,
每次从JavaVM *vm中获取,因为线程独立。JavaVM从JNI_OnLoad中获取

bool getCurEnv(JNIEnv **env_jni, bool *shouldDetach_jni) {
    *shouldDetach_jni = false;
    JNIEnv *env = NULL;
    if (vm_btalk->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
        // LOGD("GetEnv failed -> AttachCurrentThread");
        if (vm_btalk->AttachCurrentThread(&env, NULL) < 0) {
            LOGE("call AttachCurrentThread error! vm_btalk = %p, env = %p", vm_btalk, env);
            return false;
        }
        else
            // LOGD("AttachCurrentThread success");
            *shouldDetach_jni = true;
    }
    env = NULL;
    vm_btalk->GetEnv((void **)&env, JNI_VERSION_1_4);
    *env_jni = env;
    return true;
}

使用后释放,如下

    //detach thread
    if (env != NULL && shouldDetach) {
        vm_btalk->DetachCurrentThread();
        LogUtils::getInstance()->logD("D DetachCurrentThread() finished in " + fun);
    }

Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务