AttachCurrentThread & DetachCurrentThread

记录下:

默认 是attatch的 (从java线程传入 env JNI方式 !invoke)

Webrtc 获取JNIEnv

void VideoSinkWrapper::OnFrame(const VideoFrame& frame) {
  JNIEnv* jni = AttachCurrentThreadIfNeeded();
  ScopedJavaLocalRef<jobject> j_frame = NativeToJavaVideoFrame(jni, frame);
  Java_VideoSink_onFrame(jni, j_sink_, j_frame);
  ReleaseJavaVideoFrame(jni, j_frame);
}
// Return a |JNIEnv*| usable on this thread.  Attaches to |g_jvm| if necessary.
JNIEnv* AttachCurrentThreadIfNeeded() {
  JNIEnv* jni = GetEnv();
  if (jni)
    return jni;
  RTC_CHECK(!pthread_getspecific(g_jni_ptr))
      << "TLS has a JNIEnv* but not attached?";

  std::string name(GetThreadName() + " - " + GetThreadId());
  JavaVMAttachArgs args;
  args.version = JNI_VERSION_1_6;
  args.name = &name[0];
  args.group = nullptr;
// Deal with difference in signatures between Oracle's jni.h and Android's.
#ifdef _JAVASOFT_JNI_H_  // Oracle's jni.h violates the JNI spec!
  void* env = nullptr;
#else
  JNIEnv* env = nullptr;
#endif
  RTC_CHECK(!g_jvm->AttachCurrentThread(&env, &args))
      << "Failed to attach thread";
  RTC_CHECK(env) << "AttachCurrentThread handed back NULL!";
  jni = reinterpret_cast<JNIEnv*>(env);
  RTC_CHECK(!pthread_setspecific(g_jni_ptr, jni)) << "pthread_setspecific";
  return jni;
}

//java

new Thread(new Runnable() {
    @Override
    public void run() {
        String test = testJNIThread();
        Log.e(TAG, "test:" + test);

    }
}).start();

//c++

JNIEXPORT jstring JNICALL
Java_com_tyeralin_jnithread_MainActivity_testJNIThread(JNIEnv *env, jobject thiz) {

    JavaVM *vm = NULL;
    int result = env->GetJavaVM(&vm);
    if (!result) {
        bool detatched = (vm->GetEnv((void **) &env, JNI_VERSION_1_6) == JNI_EDETACHED);
        if (detatched) {
            vm->AttachCurrentThread(&env, nullptr);

        }
        LOGD("detatched:%d", detatched);
        jclass cz = env->FindClass("com/tyeralin/jnithread/MainActivity");
        if (cz == NULL)
            goto FAILED;
        jmethodID print = env->GetMethodID(cz, "print", "(Ljava/lang/String;)V");
        if (print == NULL)
            goto FAILED;
        const char *value = "from jni";
        jstring args = env->NewStringUTF(value);
        env->CallVoidMethod(thiz, print, args);

        if (detatched) {
            vm->DetachCurrentThread();
        }
        return args;
    }
    FAILED:
    return NULL;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值