2012-06-19 3 views
6

Мне нужно работать с активами в папке с моими ресурсами из кода C/C++. Безопасно ли кэшировать указатель AAssetManager как это ...:Android NDK - с помощью AssetManager в собственном коде

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

... и затем использовать его всякий раз, когда мне это нужно? CreateAssetManager вызывается из Java onCreate метода основной активности (поток пользовательского интерфейса), но использование в C/C++ заключается в том, что при рендеринге рендеринга и тике игры, вызванной из собственных методов в реализации GLSurfaceView, используется.

1) будет ли указатель assetMgr указывать на действительный объект durin для всего приложения? Достаточно ли его создать так же, как статическая переменная на стороне Java (в классе Activity), поэтому сборщик мусора не уничтожит его?

2) есть ли какая-то опасность, я столкнусь с некоторыми проблемами с потоками?

Спасибо, Том Atom

+0

Err на безопасной стороне и не кэшировать. 'AAssetManager_fromJava()' очень быстро. –

+0

Благодарим за сообщение. Причина, по которой я хотел его кэшировать, заключалась в том, что я не знаю, как получить указатель, не имея «jobject assetManager» в вызове метода. Итак, должен ли я добавить этот параметр в каждый тиковый вызов с Java на C/C++ только для случая, в котором он понадобится во время отметки? Или есть какой-то способ, как я могу запросить Java для объекта вовремя, когда мне это нужно (спросите Java для AssetManager, затем вызовите AAssetManager_fromJava, а затем используйте его ...) –

ответ

3

Один немного более безопасный способ для кэширования менеджер активов будет держать глобальную ссылку на основном объект Java на стороне C вместе с кешированной AAssetManager указателя. По крайней мере, вы знаете, что объект Java за/вокруг объекта C не будет собираться мусором.

Для этого позвоните по номеру .

И доступ к управляющему активами по границе потока будет довольно сумасшедшим, ИМХО. Это очень сильное конструктивное ограничение - если не указано явно, безопасность потоков никогда не может быть принята по умолчанию.

2

Я написал модуль NDK, Assetbridge, что также может оказаться полезным. Он экспортирует содержимое ресурсов/папок вашего проекта (файлов и каталогов) во временный каталог и затем устанавливает переменную среды для этого пути, поэтому ваш собственный код может chdir() в каталог temp, и вы можете использовать обычный старый стандарт библиотеки IO.

Смежные вопросы