【问题标题】:Why fopen gets fail in native method due to permission issue from Android-NDK application?为什么 fopen 由于 Android-NDK 应用程序的权限问题而在本机方法中失败?
【发布时间】:2012-04-25 07:43:13
【问题描述】:

看到我在一个本地调用中有以下代码

errno = 0;

FILE *fp;
fp = fopen("jigar.txt","wb");
if(fp == NULL)
    __android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN FAIL with %d",errno);
else
    __android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN pass "); 

失败并显示

FOPEN FAIL with 30

现在这里 30 表示它显示错误

#define EROFS       30  /* Read-only file system */

在我的应用程序的 MainFest 文件中,我添加了这一行

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

我仍然收到此错误..

如何解决这个问题?


编辑

感谢指定文件夹名称它可以工作但是

在我的情况下,我有一个库,它有这样的 fopen() 调用,我无法提供文件名。它采用默认文件名。

我在我的 ndk 应用程序中使用这个库,所以在这种情况下如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    默认情况下,当您运行您的应用程序时,它会在自己的上下文中运行。 fopen("jigar.txt","wb");将尝试在当前目录中打开文件,我认为主要是 /data/.. 所以你不能创建这样的文件。相反,如果您想要 /data/ 中的文件夹,您可以调用函数 gteDir() 并在其中创建自己的文件。好的,这只是一般信息。

    来到您的问题,如上所述,您需要提供绝对路径才能在不同目录中创建文件。即使在 Linux 中也是如此。

    对于图书馆的事情,你可以做两件事。

    1) 更改库源代码并使用 NDK 再次编译。在进行更改时,为 fopen() 提供一些字符串作为参数,您将在执行应用程序时将其传递给它。

    2) remount 库在其中创建文件的文件系统,然后对正在创建文件的特定目录执行 chmod 777。现在执行应用程序。它应该工作。但这不是通用的。如果您是出于某种测试目的而这样做,那么此解决方案最简单且省时...

    如果卡在某个地方,请告诉我..

    【讨论】:

    • 嘿,谢谢哥们,我们几乎同时解决了问题..!!!你的两个建议都是正确的,但我的工作没有看到我的答案,是的,默认情况下当前目录路径不是“/data/”,而是它的“/”根据我的理解。!!!
    • 很好,问题得到了解决。检查我在您的解决方案上发布的评论。只要照顾好剩下的,我就觉得一切都很好......无论如何,恭喜你解决了你自己的问题.. :)
    【解决方案2】:

    您应该指定写入“jigar.txt”文件的文件夹。像这样:

    fp = fopen("/sdcard/figar.txt", "wb");
    

    【讨论】:

      【解决方案3】:

      yuppi 我终于明白了

      我就是这样做的

      首先将我的进程的当前目录从"/"更改为"/sdcard/"

      chdir("/sdcard/");
      

      然后它找到相对于 /sdcard/ 的路径

      一切正常..!!!

      【讨论】:

      • 是的,这也是一个很好的解决方案。但是如果您的库通过假设它们的存在对本地文件进行更多操作,则更改目录可能会产生问题。您可以做的是读取当前目录位置。将其存储在一个字符串中,执行 chdir,执行操作并再次执行 chdir 到旧位置。理想情况下,这不应该造成问题.. 一切顺利
      • 是的,我认为这不是更改当前目录的道德方式,但感谢您在完成工作后提出的建议,我会将当前目录更改回其原始值..!!
      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多