JNI 回调时出现运行时错误
Runtime error on JNI callback
当我从本机代码进行 JNI 回调时,我遇到了一个致命错误:
SIGSEGV ..
Distribution: CentOS release 5.9 (Final), x64
Problematic frame:
V [libjvm.so+0x53499f] JNI_CreateJavaVM+0x20e6f
对问题很重要的代码:
JavaVM *JVM;
JavaVMAttachArgs args;
jobject jlistener;
jmethodID callback;
JNIEXPORT void JNICALL JNI_FUNC_NAME(open) (JNIEnv *env, jobject obj, jobject config) {
env->GetJavaVM(&JVM);
args.version = JNI_VERSION_1_6;
args.name = "notifyThread";
args.group = NULL;
// ...
}
JNIEXPORT void JNICALL JNI_FUNC_NAME(setListener) (JNIEnv *env, jobject obj, jobject listener) {
jlistener = env->NewGlobalRef(listener);
jclass thisClass = env->GetObjectClass(listener);
jmethodID callback = env->GetMethodID(thisClass, "messageRx", "(B)V");
// if (NULL == notifyMethod) return;
return;
}
void notify(jbyte x) {
JNIEnv *jniEnv;
int envState = JVM->GetEnv((void **)&jniEnv, 0x00010006);
if(envState == (-2)) {
if(JVM->AttachCurrentThread((void**)&jniEnv, &args) != 0)
jniEnv->ThrowNew(exc, "Could not attach current notifying thread.");
}
jniEnv->CallVoidMethod(jlistener, callback, x); // notify
JVM->DetachCurrentThread();
}
如果我注释掉回调行( jniEnv->CallVoidMethod ...
),没有问题,一切都按预期工作。问题在于实际的回调,更奇怪的是,在某些 JVM 上它可以工作。
你对此有什么想法吗?
问题是在
创建对侦听器对象的全局引用之前使用了回调(jlistener
未初始化)。
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 运行时错误:引用绑定到类型为"int"的空指针
- 为什么当 vector 为空时会显示运行时错误?
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 运行时错误:矢量下标超出范围:正在检查空集
- 分配给gslice_array会导致运行时错误
- cout 新创建的对象引发运行时错误
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- JNI 回调时出现运行时错误
- <void><void>使用 g++ 4.8.3 时从"回调::func*"转换为非标量类型"回调"请求错误?
- C++回调函数运行时错误