2012-06-19 18 views
6

Ho bisogno di lavorare con le risorse nella mia cartella delle risorse da codice C/C++. E 'sicuro per memorizzare nella cache puntatore a AAssetManager così ...:NDK Android - utilizzo di AssetManager nel codice nativo

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;  
} 

... e poi usarlo ogni volta che ne ho bisogno? Il metodo createAssetManager viene chiamato dal metodo onCreate di Java dell'attività principale (thread dell'interfaccia utente), ma l'utilizzo in C/C++ si verifica quando l'elaborazione nativa del rendering e del gioco viene richiamata dai metodi nativi nell'implementazione di GLSurfaceView.

1) il puntatore assetMgr punta all'oggetto valido per tutta la durata dell'app? È sufficiente crearlo anche come variabile statica sul lato Java (nella classe Activity) in modo che il garbage collector non lo distrugga?

2) C'è qualche pericolo in cui si verificheranno dei problemi con i thread?

Grazie, Tom Atom

+0

Errare sul lato sicuro e non memorizzare nella cache. 'AAssetManager_fromJava()' è molto veloce. –

+0

Grazie per la risposta. Il motivo per cui ho voluto nasconderlo era che non so come ottenere il puntatore senza avere "jobject assetManager" nella chiamata al metodo. Quindi, devo aggiungere questo parametro in ogni chiamata tick da Java a C/C++ solo per il caso che mi servirà durante il tick? O c'è un modo in cui posso interrogare Java per l'oggetto in tempo quando ne ho bisogno (chiedi a Java per AssetManager, quindi chiama AAssetManager_fromJava, quindi usalo ...) –

risposta

3

Un modo marginalmente più sicuro per memorizzare nella cache l'asset manager sarebbe quello di mantenere un riferimento globale per l'oggetto Java sottostante sul lato C insieme con il puntatore AAssetManager cache. Almeno con quello sapresti che l'oggetto Java dietro/intorno all'oggetto C non sarà raccolto.

Per fare ciò, chiamare .

E l'accesso al gestore di asset attraverso il limite del thread sarebbe piuttosto folle, IMHO. Questo è un vincolo di progettazione molto forte - a meno che non sia documentato esplicitamente, la sicurezza del thread non può mai essere assunta di default.

2

Ho scritto un modulo NDK, Assetbridge, che potrebbe anche essere utile. Esporta i contenuti delle risorse/cartella del progetto (file e directory) in una directory temporanea e quindi imposta una variabile di ambiente su quel percorso, in modo che il codice nativo possa chdir() alla directory temporanea ed è possibile utilizzare il vecchio standard normale routine di file IO della libreria.

Problemi correlati