如何通过JNI从C访问Android资源,例如.txt文件?
我尝试使用"file:///android_asset/myFile.txt"和本地的"myFile.txt",并在jni文件夹中复制了一个myFile.txt的副本与C实现文件。
如何通过JNI从C访问Android资源,例如.txt文件?
我尝试使用"file:///android_asset/myFile.txt"和本地的"myFile.txt",并在jni文件夹中复制了一个myFile.txt的副本与C实现文件。
关于资源文件的问题在于你不能像访问普通文件一样直接获取它们,这是因为资源文件直接从 APK 中读取,安装后不会解压到指定文件夹。
从 Android 2.3 开始,提供了 C API 来访问资源。可以查看 <android/asset_manager.h>
和 <android/native_activity.h>
中的 assetManager
字段。尽管我从未使用过这个功能,但我不确定如果不使用原生活动是否可以使用此资源管理器 API。总之,在 Android 2.2 及以下版本中无法使用该 API。
所以我有三个选项:
InputStream
对象中读取数据。虽然需要些代码,但效果非常好。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()
复制资源(rsrcId)到目标文件(dstFile)
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;
}