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

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

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

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

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

0

Решение

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

Глобальные и локальные ссылки (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 ().

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector