使用上面代码报错 jobject is an invalid JNI transition frame reference or invalid reference
时间: 2023-09-18 12:06:49 浏览: 319
基于jni调用时,jvm报错问题的深入分析
如果在JNI中使用 `jobject` 类型的变量作为回调方法的参数,需要注意在调用Java回调方法之前,需要使用 `env->NewGlobalRef()` 函数将 `jobject` 对象创建为全局引用。这是因为在回调方法调用结束后,JNI环境可能会将本地引用释放掉,如果不将 `jobject` 对象创建为全局引用,就会导致回调方法的参数变成无效引用。
因此,在您的示例代码中,您需要将 `jobj` 对象创建为全局引用,示例如下:
```c++
// 将 void* 转换为 jobject
void* voidPtr = ...;
jobject jobj = reinterpret_cast<jobject>(voidPtr);
// 创建全局引用
jobject globalObj = env->NewGlobalRef(jobj);
// 获取Java对象和回调方法信息
JNIEnv* env = ...;
jclass clazz = env->GetObjectClass(obj);
jmethodID callbackMethodID = env->GetMethodID(clazz, "callback", "(Ljava/lang/Object;)V");
// 调用Java回调方法
env->CallVoidMethod(callbackObj, callbackMethodID, globalObj);
// 释放资源
env->DeleteLocalRef(clazz);
env->DeleteGlobalRef(globalObj);
```
在这个示例中,我们在调用Java回调方法之前,使用 `env->NewGlobalRef()` 函数将 `jobj` 对象创建为全局引用 `globalObj`。接着,我们调用Java回调方法,并将 `globalObj` 作为参数传递给它。最后,释放资源,包括删除本地引用和全局引用。
需要注意的是,使用 `env->NewGlobalRef()` 函数创建全局引用会占用更多的内存,因此需要在不需要使用全局引用时,使用 `env->DeleteGlobalRef()` 函数将其释放掉。
阅读全文