我正在编写一些代码来获取一个从C调用静态
Java方法的衍生线程.
调用该方法的位如果放在来自Java的本机调用中,则工作正常,但不是来自具有附加JNIEnv的线程.
我已经设置了一个JavaVM *如下:
jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
LOGI("Setting Java Virtual Machine");
ThreadJNIEnvironment::javaVM = jvm;
return JNI_VERSION_1_6;
}
这确实被调用了.
然后我产生另一个线程,从这个线程我做以下事情:
JNIEnv* env;
jint ret = ThreadJNIEnvironment::javaVM->AttachCurrentThread(&env, NULL);
LOGI("AttachCurrentThread returned %d", ret);
jclass interfaceClass = env->FindClass("com/ecmsys/mcb/model/McbInterface");
jmethodID testMethod = env->GetStaticMethodID(interfaceClass, "Test", "()V");
env->CallStaticVoidMethod(interfaceClass, testMethod);
AttachCurrentThread返回0.
GetStaticMethod虽然爆炸,但出现以下错误:
Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1).....
我只是看不出我做了什么来扰乱它…哦等等……你不能从一个产生的线程访问Java应用程序类而不做一些设置…
jint JNI_OnLoad(JavaVM* jvm, void* reserved)
{
LOGI("Setting Java Virtual Machine");
ThreadJNIEnvironment::javaVM = jvm;
JNIEnv* env;
jvm->AttachCurrentThread(&env, NULL);
jclass mcbInterface = env->FindClass("com/ecmsys/mcb/model/McbInterface");
ThreadJNIEnvironment::interfaceClass = env->NewGlobalRef(mcbInterface);
return JNI_VERSION_1_6;
}
然后这样做:
JNIEnv* env;
jint ret = ThreadJNIEnvironment::javaVM->AttachCurrentThread(&env, NULL);
LOGI("AttachCurrentThread retured %d", ret);
if(ThreadJNIEnvironment::interfaceClass)
{
jmethodID testMethod = env-->GetStaticMethodID(static_castThreadJNIEnvironment::interfaceClass), "Test", "()V");
env->CallStaticVoidMethod(static_cast(ThreadJNIEnvironment::interfaceClass), testMethod);
}
ThreadJNIEnvironment::javaVM->DetachCurrentThread();
你生活和学习!