0

我正在使用带有 cocos2dx 的 NDK。在 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)

提前致谢。

4

1 回答 1

0

尝试全局引用。请参见:

全局和局部引用(Oracle 关于 JNI)

什么是“JNI 全局参考”(在 StackOverflow 上)

“JNI 全局引用是从“本机”代码到由 Java 垃圾收集器管理的 Java 对象的引用。” “JNI 全局引用容易出现内存泄漏。”

存储应用程序上下文或多或少是安全的,在初始化期间存储对 Activity 的引用几乎肯定是内存泄漏(通常在屏幕转动后创建一个新的 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()中清除。

于 2015-10-01T07:27:37.537 回答