【发布时间】:2012-06-21 15:40:37
【问题描述】:
我需要在 C/C++ 代码中处理我的资产文件夹中的资产。像这样缓存指向 AAssetManager 的指针是否安全...:
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 是从主 Activity(UI 线程)的 Java onCreate 方法调用的,但在 C/C++ 中的用法是在 GLSurfaceView 实现中原生处理从本机方法调用的渲染和游戏滴答时。
1) 在整个应用程序生命周期内,assetMgr 指针会指向有效对象吗?在 Java 端(在 Activity 类中)像静态变量一样创建它是否足以让垃圾收集器不会破坏它?
2) 我会遇到线程问题吗?
谢谢,汤姆原子
【问题讨论】:
-
为了安全起见,不要缓存。
AAssetManager_fromJava()非常快。 -
感谢您的回复。我想缓存它的原因是我不知道如何在方法调用中没有“jobject assetManager”的情况下获取指针。那么,我是否必须将此参数添加到从 Java 到 C/C++ 的每个刻度调用中,以防万一我在刻度期间需要它?或者有什么方法可以让我在需要时及时查询 Java 对象(向 Java 询问 AssetManager,然后调用 AAssetManager_fromJava,然后使用它...)
标签: android thread-safety android-assets android-ndk