在CPP层中使用android上下文时在安卓上崩溃。
在CPP层中使用android上下文时在安卓上崩溃。
我正在使用NDK和cocos2dx。在main.cpp中,我有以下方法。\n
void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz, jint w, jint h)
\n是否可能将 jobject thiz 分配给另一个对象并在cpp中使用?就像这样:-\n
static jobject context = NULL; void Manager::SetJobject(jobject object) { context = object; } ............. //在其他类中 //如果平台==ANDROID connectToSomeThirdParty(context, key );
\n我尝试了这个,但是我得到了崩溃。崩溃日志如下所示:\n
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)
\n提前致谢。
在Android的CPP层使用Android上下文时崩溃的问题的原因是因为JNI全局引用的使用不当,JNI全局引用是从"native"代码到由Java垃圾回收器管理的Java对象的引用,但是JNI全局引用容易导致内存泄漏。在初始化期间存储对Activity的引用几乎肯定会导致内存泄漏(通常在屏幕旋转后会创建一个新的Activity并且旧的Activity会被垃圾回收)。为了避免这个问题,可以考虑使用全局引用来存储应用程序上下文,并在需要访问上下文的地方使用全局引用。以下是一个示例的代码重构,建议在初始化期间存储应用程序上下文的全局引用,并在onResume()和onPause()方法中设置和清除对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); }
尽管建议保留应用程序上下文,但人们确实会使用对Activity的引用,但通常这样的引用会在onResume()方法中设置,在onPause()方法中清除。