Ich muss mit Assets in meinem Assets-Ordner aus dem C/C++ - Code heraus arbeiten. Ist es sicher, Zeiger auf AAssetManager so cachen ...:Android NDK - Verwenden von AssetManager in systemeigenem Code
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;
}
... und dann, es zu benutzen, wenn ich sie brauche? Der createAssetManager wird von der Java onCreate-Methode der Hauptaktivität (UI-Thread) aufgerufen, aber die Verwendung in C/C++ erfolgt, wenn nativ das Rendering und das Spielticket von nativen Methoden in der GLSurfaceView-Implementierung aufgerufen werden.
1) Wird der AssetMgr-Zeiger während der gesamten Anwendungslebensdauer auf ein gültiges Objekt zeigen? Ist es genug, um es auch als statische Variable auf der Java-Seite (in der Aktivitätsklasse) zu erstellen, damit der Garbage Collector es nicht zerstört?
2) Gibt es eine Gefahr, dass ich einige Probleme mit Threads bekomme?
Danke, Tom Atom
Err auf der sicheren Seite und nicht zwischenspeichern. 'AAsetManager_fromJava()' ist sehr schnell. –
Vielen Dank für die Antwort. Der Grund, warum ich es zwischenspeichern wollte, war, dass ich nicht weiß, wie man den Zeiger bekommt, ohne "jobject AssetManager" im Methodenaufruf zu haben. Also, muss ich diesen Parameter bei jedem Tick-Aufruf von Java zu C/C++ hinzufügen, nur für den Fall, dass ich ihn während des Ticks brauche? Oder gibt es eine Möglichkeit, wie ich Java für das Objekt rechtzeitig abfragen kann, wenn ich es brauche (fragen Sie Java nach AssetManager, dann rufen Sie AAsetManager_fromJava auf, dann benutzen Sie es ...) –