Muszę pracować z zasobami w folderze zasobów z poziomu kodu C/C++. Czy bezpieczne jest buforowanie wskaźnika do AAssetManager w ten sposób:Android NDK - używanie AssetManager w natywnym kodzie
AAssetManager* assetMgr = NULL;
void Java_com_example_createAssetManager(JNIEnv* env, jclass clazz, jobject assetManager)
{
AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
assert(NULL != mgr);
assetMgr = mgr;
}
... a następnie użyć go, gdy jest to potrzebne? Kreator createAssetManager wywoływany jest z metody onCreate Java na głównym działaniu (wątek UI), ale użycie w C/C++ polega na tym, że nativly przetwarza renderowanie i tickety gier wywołane z natywnych metod w implementacji GLSurfaceView.
1) Czy wskaźnik assetMgr wskaże prawidłowy obiekt podczas całego cyklu życia aplikacji? Czy wystarczy utworzyć go również jak statyczną zmienną po stronie Java (w klasie Activity), aby garbage collector go nie zniszczył?
2) Czy jest jakieś niebezpieczeństwo, że napotkasz problemy z wątkami?
Dzięki, Tom Atom
Błąd po bezpiecznej stronie i nie buforuj. 'AAssetManager_fromJava()' jest bardzo szybkie. –
Dziękuję za odpowiedź. Powodem, dla którego chciałem go buforować, było to, że nie wiem, jak uzyskać wskaźnik bez "jobject assetManager" w wywołaniu metody. Czy muszę dodać ten parametr do każdego wywołania od Javy do C/C++, tylko na wypadek, gdy będę go potrzebował podczas zaznaczania? Czy jest jakiś sposób, w jaki mogę zapytać Javę o obiekt w czasie, kiedy go potrzebuję (zapytaj Javę o AssetManager, następnie zadzwoń do AAssetManager_fromJava, a następnie użyj go ...) –