在CPP层中使用android上下文时在android中崩溃

时间:2015-10-01 06:10:17

标签: android c++ android-ndk cocos2d-x-2.x

我正在使用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)

提前致谢。

1 个答案:

答案 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()中清除。