【问题标题】:Write file to location other than SDcard using Android NDK?使用Android NDK将文件写入SD卡以外的位置?
【发布时间】:2011-06-11 12:08:29
【问题描述】:

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

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

还有其他相当于:

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

那可以让你像在文件系统上写什么吗?

【问题讨论】:

  • 在此链接中回答:stackoverflow.com/questions/1992953/…>

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


【解决方案1】:
  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 访问 使用您的应用程序。一些游戏 用这种方式做事,但我 不会推荐它。如果你还 想做这个,查找Superuser 安卓应用程序,它是免费的 值得信赖。

一旦你有了 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)

干杯!

【讨论】:

  • 最后一个代码示例中0770 包含的标志。 mkdir("/data/data/com.app/databases", S_IRWXU | S_IRWXG | S_IWOTH | S_IXOTH); 对我不起作用 :(
【解决方案2】:

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

【讨论】:

  • 那个“特殊数据目录”的位置在哪里?因为我确实认为并非所有手机都有 SD 卡......所以 /sdcard/ 目录。不可靠。 TIA
  • 您可以使用以下命令询问操作系统目录在 Java 中的位置: mContext.getFilesDir(); mContext.getExternalFilesDir(null);由于设备的内部存储空间可能有限,因此您应该为大型对象提供外部存储空间。
  • 我拥有设备的根访问权限。您能否解释一下我如何访问文件系统。尝试在系统中打开文件对我不起作用。请检查此link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多