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