如何在安卓JNI中设置文件路径
How to set file path in Android JNI?
我正在使用C++库构建一个Android应用程序,并且在发送文件路径时遇到问题。
我在jni/processing.cpp
中具有我的 JNI 功能:
JNIEXPORT jfloat JNICALL Java_com_my_package_path_getMyFunction
(JNIEnv *env, jobject obj, jstring param) {
string str = env->GetStringUTFChars(param, 0);
string filePath = "src/textfile/";
return getResult(str, filePath);
}
getResult()
是jni/src/library/myclass.cpp
的成员函数。
我在 jni/src/textfiles/
下有几个文本文件,我想将此路径作为参数发送到getResult()
函数。由于processing.cpp
在jni/
文件夹中,我将 path 设置为 src/textfile/
,但它不起作用。(getResult()
函数找不到路径)
我已经尝试过filePath = "../../textfile/"
这是jni/src/library/myclass.cpp
的相对路径,但它也不起作用。
但是,我所有其他 JNI 函数(不使用文件路径)都工作正常。
有人可以帮忙吗?我应该使用绝对路径吗?那么,我怎样才能得到它呢?
我自己找到了解决方案。
根据Chris上面的评论,我将文本文件放入assets
文件夹中。
我尝试从 JNI 访问assets
文件夹(像这样),但有些不起作用。
所以我用Java读取文件,并将文件再次存储到内部存储中。由于我们知道data/data/your_app_package_name/
是内部存储路径,因此我可以从 JNI 读取文件。
这是我如何从assets
读取文件并存储到内部存储的代码:
AssetManager assetManager = getResources().getAssets();
String[] files = null;
try {
files = assetManager.list("Files");
} catch (Exception e) {
Log.d(MYLOG, "ERROR : " + e.toString());
}
for (int i = 0; i < files.length; i++) {
InputStream in = null;
OutputStream out = null;
FileOutputStream fileOutStream = null;
try {
Log.d(MYLOG, "file names : " + files[i]);
in = assetManager.open("Files/" + files[i]);
out = new FileOutputStream(getApplicationContext().getFilesDir() + files[i]);
File file = new File(getApplicationContext().getFilesDir(), files[i]);
byte[] buffer = new byte[65536 * 2];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
in = null;
out.flush();
fileOutStream = new FileOutputStream(file);
fileOutStream.write(buffer);
out.close();
out = null;
Log.d(MYLOG, "File Copied in storage");
} catch (Exception e) {
Log.d(MYLOG, "ERROR: " + e.toString());
}
}
我不确定这是正确的解决方案,但它运行良好! :)
我不知道是否真的可以使用 JNI 获取assets
目录的路径(不过我不是专家):我不知情的意见是 Android 开发人员可能希望我们通过代理访问文件无论如何,这样做可能是个好主意以确保未来的兼容性。
您可能可以使用类似于您在答案中解释的技巧来获取裸路径,并从 java 获取资产路径,然后通过 JNI 将其传递给 C。
无论如何,我认为从 jni 访问 Assets
中的文件的性能(更不用说空间)有效方法是使用 AAssetManager
函数:
安卓使用 C 从资产文件夹中读取文本文件 (ndk)
和
在 JNI 中获取项目中文件的相对路径
尽管如此,对独创性的公认答案+1 :)
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 在C++中设置基于操作系统的文件路径
- 如何将 2 个类分成单独的 .h 文件并正确设置它们
- Visual Studio 2019 - 设置文件类型的默认扩展名
- 如何在运行时对程序创建的.sys文件设置文件版本
- 设置文件属性成功,但检索其失败
- ERROR_ACCESS_DENIED设置文件所有者
- 在C++中设置文件修改时间的可移植方法
- 我正在尝试设置文件流或类似的东西,但我对我应该做什么感到非常困惑
- Qt-设置.o文件的输出路径
- C++如何在VS 2015中设置文件之间的链接
- 在c++中设置文件颜色
- 如何在linux上使用c++为特定文件设置文件属性(1644)
- 正在设置文件指针位置
- Boost日志:日志设置文件和代码配置的交互
- 如何正确设置文件对齐
- 如何在C++中打开文件时设置文件权限
- 使C可执行/设置文件在任何计算机上运行
- 如何在安卓JNI中设置文件路径
- 如何部署c++应用程序,并为我的音乐播放器创建设置文件