我有一些由 android JNI 用 c++ 编写的代码。
在一个导出函数中
"extern "C" JNIEXPORT int JNICALL Java_com_android_mymapsforge_create(JNIEnv *env, jobject obj)
{
...
ifstream infile("C:\\Users\\li\\Documents\\Visual Studio 2010\\Projects\\importANN\\Debug\\nodes.csv");
string line;
int index = 0;
while( getline( infile, line ))
{
....
}
}
当我使用那些原始的 c++ 代码时,我在 vs2010 下进行测试。要么我为 infile() 参数分配一个固定的文件路径,要么使用一些 c++ get_file_path 函数,这是一个与 Windows 系统相关的东西,没有问题。两者都有效。
但现在我想在 android 使用的 JNI 下使用这些代码。所以文件路径系统更改为android并且需要调整一些功能。
我的问题出现了:因为代码最终被我的 android java 代码在 android 应用程序下使用,所以“C:\Users\li\Documents\Visual Studio 2010\Projects\importANN\Debug\nodes.csv” , 不再生效,可能会改为“/mnt/sdcard/somefolder/nodes.csv”
但是我有经验,当我在 android 应用程序中给出一个固定的文件路径时,它告诉我一些错误,所以在 android jave envi 下,我使用下面的代码来获取文件路径,类似的代码在这里:
String mpath ;
mpath = Environment.getExternalStorageDirectory().getPath();
mapView.setMapFile(new File(mpath+"/"+"berlin.map"));
(省略文件名,我只想说说我用的方法)
但是这些android代码一定不能用在我的c++包装函数Java_com_android_mymapsforge_create中,
所以我的问题是:
如何处理c++导出函数下的文件(android系统)路径?例如,我将“nodes.csv”放在我的sdcard根文件夹下,想在JNI导出的c++函数下做一些处理?
最佳答案
最简单的方法是将路径作为函数的参数传递。
extern "C" JNIEXPORT int JNICALL Java_com_android_mymapsforge_create(JNIEnv *env, jobject, jstring path)
然后你可以使用 JNI converting jstring to char * 将 jstring 路径转换为 char* .
第二种方法是从 JNI 函数调用 Android Environment.getExternalStorageDirectory().getPath(),如此处所述 - Call a static java method of another package from native code .
关于java - android ndk wrapped c++ file 获取android系统文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20533863/