线程由C层pthread启动的,须要DetachCurrentThread。java
JNIEnv *env; g_jvm->AttachCurrentThread(&env, NULL); //必须AttachCurrentThread,env只能在本身的线程运行 jclass clazz = getObjectClass(env, g_monitorObj); jmethodID onLoginedMethod = getMethodID(env, clazz,"onLogStateChged","(ILjava/lang/String;)V"); jstring deviceId = (env)->NewStringUTF(TargDeviceID); env->CallVoidMethod(g_monitorObj, onLoginedMethod, CurState, deviceId); env->DeleteLocalRef(deviceId); g_jvm->DetachCurrentThread();
若由Java启动的,不须要DetachCurrentThread。jvm
JNIEnv *env; g_jvm->AttachCurrentThread(&env, NULL); //必须AttachCurrentThread,env只能在本身的线程运行 jclass clazz = getObjectClass(env, g_monitorObj); jmethodID onLoginedMethod = getMethodID(env, clazz,"onLogStateChged","(ILjava/lang/String;)V"); jstring deviceId = (env)->NewStringUTF(TargDeviceID); env->CallVoidMethod(g_monitorObj, onLoginedMethod, CurState, deviceId); env->DeleteLocalRef(deviceId); //g_jvm->DetachCurrentThread();