Я использую 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)
Заранее спасибо.
Попробуйте глобальные ссылки. Посмотри пожалуйста:
Глобальные и локальные ссылки (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 ().
Других решений пока нет …