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

11 浏览
0 Comments

在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提前致谢。

0
0 Comments

在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()方法中清除。

0