6

我需要从 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)我会遇到线程问题吗?

谢谢,汤姆原子

4

2 回答 2

3

缓存资产管理器的一种稍微安全一点的方法是在 C 端保存对底层 Java 对象的全局引用以及缓存的AAssetManager指针。至少你会知道 C 对象后面/周围的 Java 对象不会被垃圾收集。

为此,请致电env->NewGlobalRef(assetManager).

恕我直言,跨线程边界访问资产管理器将是相当疯狂的。这是一个非常强大的设计约束 - 除非明确记录,否则默认情况下永远不会假定线程安全。

于 2012-06-19T15:29:48.840 回答
2

I've written an NDK module, Assetbridge, that you might also find useful. It exports the contents of your project's assets/ folder (files and directories) to a temporary directory, and then sets an environment variable to that path, so your native code can chdir() to the temp directory and you can use the regular old standard library file IO routines.

于 2013-06-25T08:02:26.550 回答