0

我有一个使用 android-ndk 编译的本机共享库

C API 函数之一是:

int load_config(const char *fn, Config *cfg)

我已经用 JNI 包装了函数并成功地从 Java 调用它,例如

Config cfg = new Config();
my_shared_lib.load_config("test.gcf", cfg);
System.out.println("cfg.rx_id = " + cfg.getRx_id());

这将打印来自 Config 数据结构的预期值

但是现在我已经将它移植到了 Android 模拟器上,我很困惑如何处理代表配置数据文件名的字符串

我尝试将 test.gcf 添加到 $(PROJECT)/assets 目录然后:

Config cfg = new Config();
my_shared_lib.load_config("assets/test.gcf", cfg);
outputText.append("cfg.rx_id = " + cfg.getRx_id());

但这不起作用,即未输出 Config 数据结构的预期值(我只是得到一个空白)

换句话说,当您的本机库函数需要文件名作为参数时,您会怎么做?

4

1 回答 1

1

资产不存储为文件,既不在设备上,也不在模拟器上。它们存储在 APK 中,这是一个 ZIP 存档;使用 C/C++ 文件访问函数永远不会对它们起作用。要从 JNI 代码访问资产,请使用AAssetManager

现在,配置文件可能不属于资产。根据定义,资产是只读的;你希望你的配置是可变的,对吧?Context.getDir()Android上的可写数据文件夹是通过函数在Java端检索的;您从中派生文件名,并将其传递给 C 端。像这样的东西:

File Path = Ctxt.getDir("MyData", 0);
File FileName = new File(Path, "test.gcf");
my_shared_lib.load_config(FileName.toString(), cfg); 

所述文件夹将映射到 Android 文件系统中的以下路径: /data/data/com.mypackagename/app_MyData. 如果启用将应用程序移动到 SD 卡,则不同。

If you want to ship a default config file in assets but keep it as writeable in the data folder as the app runs, you just have to copy it from assets to the data folder on the first run. Example here.

于 2012-08-03T14:41:28.630 回答