如何使用JNI从C访问Android资产(例如.txt文件)?
我正在尝试“file:///android_asset/myFile.txt”,并在本地“myFile.txt”中使用带有C实现文件的jni文件夹中的myFile.txt副本。
答案 0 :(得分:11)
有资产的东西是你不能直接作为文件访问它们。这是因为资产是直接从APK读取的。它们在安装时不会解压缩到给定的文件夹。
从Android 2.3开始,有一个用于访问资产的C API。请查看<android/asset_manager.h>
中的assetManager
和<android/native_activity.h>
字段。我从来没有使用过这个,如果你不依赖本机活动,我不确定你是否可以使用这个资产管理器API。无论如何,这不适用于Android 2.2及更低版本。
所以我看到三个选项:
InputStream
返回的Java AssetManager.open()
对象中读取C中的数据。它需要一些代码,但效果很好。答案 1 :(得分:2)
如果您不能使用AssetManager C API,因为您需要调用需要文件名的C / C ++库,而是可以使用原始资源。
唯一的缺点是需要在运行时将其复制到应用程序的数据(临时)目录。
将要从本机代码中读取的文件放在res/raw
目录中。
在运行时,将文件从res/raw/myfile.xml
复制到data
目录:
File dstDir = getDir("data", Context.MODE_PRIVATE);
File myFile = new File(dstDir, "tmp_myfile.xml");
FileMgr.copyResource(getResources(), R.raw.my_file, myFile);
现在传递给您的本机代码的文件名为myFile.getAbsolutePath()
public static File copyResource (Resources r, int rsrcId, File dstFile) throws IOException
{
// load cascade file from application resources
InputStream is = r.openRawResource(rsrcId);
FileOutputStream os = new FileOutputStream(dstFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1)
os.write(buffer, 0, bytesRead);
is.close();
os.close();
return dstFile;
}