【问题标题】:android ndk wrapped c++ file get android system file pathandroid ndk包装的c++文件获取android系统文件路径
【发布时间】:2013-12-12 02:22:56
【问题描述】:

我有一些由 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++函数下做一些处理?

【问题讨论】:

    标签: java android c++ android-ndk filesystems


    【解决方案1】:

    最简单的方法是将路径作为函数的参数传递。

    extern "C" JNIEXPORT int JNICALL Java_com_android_mymapsforge_create(JNIEnv *env, jobject, jstring 路径)

    然后您可以使用JNI converting jstring to char * 将 jstring 路径转换为 ​​char*。

    第二种方法是从 JNI 函数中调用 Android Environment.getExternalStorageDirectory().getPath(),如下所述 - Call a static java method of another package from native code

    【讨论】:

    • 第三种方法是将路径存储在 Java 类的 String 成员中,然后从本机代码中获取该值,但将其作为参数传递可能是最简单/最好的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2011-10-02
    • 2016-10-29
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多