2012-06-19 12 views
6

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

+0

Błąd po bezpiecznej stronie i nie buforuj. 'AAssetManager_fromJava()' jest bardzo szybkie. –

+0

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 ...) –

Odpowiedz

3

Jeden marginalnie bezpieczniejszy sposób buforować zarządzającego aktywami byłoby utrzymać globalną odniesienie do bazowego obiektu Javy po stronie C wraz z pamięci podręcznej AAssetManager wskaźnika. Przynajmniej z tym, że wiesz, że obiekt Java za/wokół obiektu C nie będzie zbierać śmieci. Aby uzyskać to, zadzwoń pod numer .

Uzyskanie dostępu do menedżera aktywów przez granicę wątku byłoby raczej szalone, IMHO. To bardzo silne ograniczenie projektowe - o ile nie zostało to wyraźnie udokumentowane, bezpieczeństwo wątków nie może być domyślnie przyjęte.

2

Napisałem moduł NDK, Assetbridge, który może ci się przydać. Eksportuje zawartość zasobów/folderu projektu (plików i katalogów) do katalogu tymczasowego, a następnie ustawia zmienną środowiskową do tej ścieżki, aby Twój kod macierzysty mógł chdir() do katalogu tymczasowego i można użyć standardowego starego standardu procedury IO pliku biblioteki.

Powiązane problemy