Сбой в Android при использовании контекста Android на уровне CPP

Я использую NDK с cocos2dx. В main.cpp у меня есть следующий метод.

       void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv*  env, 
           jobject thiz, jint w, jint h)

Можно ли назначить задание другому объекту и использовать его в 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)

Заранее спасибо.


person charlotte    schedule 01.10.2015    source источник


Ответы (1)


Попробуйте глобальные ссылки. Пожалуйста, посмотри:

Глобальные и локальные ссылки (Oracle о JNI )

Что такое "Глобальный справочник JNI" (в StackOverflow)

«Глобальная ссылка JNI — это ссылка из «собственного» кода на объект Java, управляемый сборщиком мусора Java». «Глобальные ссылки JNI подвержены утечкам памяти».

Более-менее безопасно хранить контекст приложения, сохраняя ссылку на 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().

person 18446744073709551615    schedule 01.10.2015