我正在使用NDK和cocos2dx。在main.cpp中,我有以下方法。
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env,
jobject thiz, jint w, jint h)
是否可以将jobject thiz分配给另一个对象并在cpp中使用?就像这样: -
static jobject context = NULL;
void Manager::SetJobject(jobject object)
{
context = object;
}
.............
// in some other class
//if platform == ANDROID
connectToSomeThirdParty(context, key );
我试过这个,但我崩溃了。崩溃日志如下所示:
10-01 11:38:13.228: E/dalvikvm(5828): JNI ERROR (app bug): attempt to use stale local reference 0x1e200001
10-01 11:38:13.228: E/dalvikvm(5828): VM aborting
10-01 11:38:13.228: A/libc(5828): Fatal signal 6 (SIGABRT) at 0x000016c4 (code=-6), thread 5857 (Thread-577)
提前致谢。
答案 0 :(得分:0)
尝试全局参考。请参阅:
Global and Local References (Oracle about JNI)
What is 'JNI Global reference'(在StackOverflow上)
“JNI全局引用是从”本机“代码到Java垃圾收集器管理的Java对象的引用。” “JNI全局引用容易出现内存泄漏。”
存储应用程序上下文或者更不安全,在初始化is almost definitely a memory leak期间存储对Activity的引用(通常在屏幕转动后创建一个新的Activity并且旧的是垃圾收集)。 如果你真的不想关心释放资源,可以考虑一下 重构如:
class MyClass {
static Context mContext;
MyClass(Context c) {
mContext = c.getApplicationContext(); // or just c
}
public static myFunc(int arg) {
myFuncNative(mContext, arg);
}
private static native myFuncNative(Context c, int a);
}
仍然建议保留应用程序上下文。
人们确实使用对活动的引用,但通常这些引用在 onResume()中设置并在 onPause()中清除。