java异常类爆炸,java – JNI:调用GetStaticMethodID爆炸

我正在编写一些代码来获取一个从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();

你生活和学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值