使用Android NDK将文件写入SDcard以外的位置?

时间:2011-01-19 02:49:21

标签: android android-ndk java-native-interface storage

除了在SD卡上,还有其他方法可以将文件写入其他地方吗?

我在文件系统上尝试了很多不同的路径但是fopen总是返回NULL,除了我在/ sdcard /...中写入/读取的任何文件。

还有其他东西等同于:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

允许你在文件系统上写一些东西吗?

3 个答案:

答案 0 :(得分:18)

  1. 您始终可以访问该目录 你的应用程序放在哪里。

    这个目录通常是:

    data/data/<Your_package_name_usually com.android.appName>/files/<your_filename>

    但最好使用getFilesDir() 确保将来有效的文件路径 android的版本更改。

  2. 如果您想使用外部存储空间 相反,请确保放置此 应用程序清单中的代码行 获得许可。

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

    然后使用sdcard目录:

    getExternalStorageDirectory(); //usually : /sdcard/<your_filename>

  3. 否则,您可以root设备 并获得整体访问权限 文件系统。但你必须这样做 请求所有应用用户获取 之前在他们的设备上进行root访问 使用你的申请。一些游戏 用这种方式做事,但我 不会推荐它。如果你还是 想要这样做,查找Superuser Android的应用程序,它是免费的 可信。

  4. 获得android目录后,只需创建一个接收jstring参数的JNI本机方法,然后在本机代码中进行设置。将它转换为std :: string,你就可以使用它与fopen()。

    //Inside your java activity
    File f = this.getApplicationContext().getFilesDir(); 
    LibLoader.setupArchiveDir(f.toString());
    
    //Inside your JNI wrapper
    JNIEXPORT bool JNICALL Java_com_android_appName_LibLoader_setupArchiveDir(JNIEnv * env, jobject obj, jstring dir)
    {
            const char* temp = env->GetStringUTFChars(dir, NULL);
        std::string stringDir(temp);
    
            // Will be receive as a std::string inside C++ code 
        MyNativeObjectInC++->SetupArchiveDir(stringDir);
    }
    

    修改:

    您可能需要在第一次使用它之前手动创建C中的/ files:

    int result_code = mkdir("/data/data/com.app/files/", 0770)

    干杯!

答案 1 :(得分:5)

您可以从应用内访问两个位置,SDCard和应用的特殊数据目录。除非您具有root权限,否则任何其他地方都是禁止的。

答案 2 :(得分:-1)

必须在使用fopen(filePath, "a+")功能之前创建文件。或者使用fopen(filePath, "a")