前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JNI|在子线程中获得JNIEnv|AttachCurrentThread

JNI|在子线程中获得JNIEnv|AttachCurrentThread

作者头像
望天
发布2019-06-14 20:42:19
3.9K0
发布2019-06-14 20:42:19
举报
文章被收录于专栏:along的开发之旅along的开发之旅

A JNI interface pointer (JNIEnv*) is passed as an argument for each native function mapped to a Java method, allowing for interaction with the JNI environment within the native method.This JNI interface pointer can be stored, but remains valid only in the current thread. Other threads must first call AttachCurrentThread()to attach themselves to the VM and obtain a JNI interface pointer. Once attached, a native thread works like a regular Java thread running within a native method. The native thread remains attached to the VM until it callsDetachCurrentThread() to detach itself.[3]

void Call_Back_Invoke( void *user,int notify_id, unsigned int param )
 {
     bool  isAttacked = false;
     JNIEnv* env;
     if(NULL == jni_tmpc.g_JVM)
     {
         LOGE("g_JVM == NULL");
         return ;
     }
     int status = (jni_tmpc.g_JVM)->GetEnv((void **) &env, jni_tmpc.g_JNI_VERSION);
 
     if(status < 0) {
         LOGD("callback_handler:failed to get JNI environment assuming native thread"); 
         status = jni_tmpc.g_JVM->AttachCurrentThread(&env, NULL);
         if(status < 0) {
            LOGE("callback_handler: failed to attach current thread");
             return;
         }
         isAttacked = true;
     }
 
     switch( notify_id )
     {
        case...
          ...
     }    
     if(isAttacked) 
     {
         (jni_tmpc.g_JVM)->DetachCurrentThread();
     }    
     LOGE("jni Call_Back_Invoke(1) notify_id = %d",notify_id );
 }

补充:

PlatinumMedia中的实例代码:

NPT_Result MediaRenderer::DoJavaCallback(int type, const char *param1,
                                         const char *param2,
                                         const char *param3) {
    if (g_vm == NULL) {
        LOGE("g_vm = NULL!!!");
        return NPT_FAILURE;
    }
    int status;
    JNIEnv *env = NULL;
    bool isAttach = false;
    status = g_vm->GetEnv((void **) &env, JNI_VERSION_1_6);
    if (status != JNI_OK) {
        status = g_vm->AttachCurrentThread(&env, NULL);
        if (status < 0) {
            LOGE("MediaRenderer::DoJavaCallback Failed: %d", status);
            return NPT_FAILURE;
        }
        isAttach = true;
    }
    jstring jParam1 = NULL;
    jstring jParam2 = NULL;
    jstring jParam3 = NULL;
    jclass inflectClass = g_callbackClass;
    jmethodID inflectMethod = g_callbackMethod;
    if (inflectClass == NULL || inflectMethod == NULL) {
        goto end;
    }
    jParam1 = env->NewStringUTF(param1);
    jParam2 = env->NewStringUTF(param2);
    jParam3 = env->NewStringUTF(param3);
    env->CallStaticVoidMethod(inflectClass, inflectMethod, type, jParam1, jParam2, jParam3);
    env->DeleteLocalRef(jParam1);
    env->DeleteLocalRef(jParam2);
    env->DeleteLocalRef(jParam3);
    end:
    if (env->ExceptionOccurred()) {
        env->ExceptionDescribe();
        env->ExceptionClear();
    }
    if (isAttach) {
        g_vm->DetachCurrentThread();
    }
    return NPT_SUCCESS;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档