【问题标题】:Getting NULL when open file in C code by JNI in android在android中通过JNI在C代码中打开文件时获取NULL
【发布时间】:2014-05-14 11:20:54
【问题描述】:

我在 Android 应用中通过 JNI 调用 C 代码。

调用时一切正常,但是当我输入这段代码时:

FILE* fp = fopen("/storage/sdcard0/input.txt","w+");
if(fp==NULL)
    return(*env)->NewStringUTF(env,"n");
else
    return(*env)->NewStringUTF(env,"y");

它得到“n”。我确定路径是真的,我在我的手机终端上尝试了这个命令:

cat /storage/sdcard0/input.txt

它给了我文件的内容。

编辑:

我尝试通过此代码更改文件的权限,但它给了我相同的响应:

void changePerm()
{
    Process chperm;
    try {
        chperm=Runtime.getRuntime().exec("su");


   DataOutputStream os = 
          new DataOutputStream(chperm.getOutputStream());
        os.writeBytes("chmod 777 /storage/sdcard0/input.txt\n");
        os.flush();

        os.writeBytes("exit\n");
        os.flush();

          chperm.waitFor();

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
}

我也添加了这个权限,没有任何改变:

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

【问题讨论】:

  • 您是否尝试过分解您的陈述以查看哪一行造成了问题?
  • 您查看权限了吗?是什么让您认为您的应用有权从外部存储的根目录读取/写入?
  • @Al-mo 没有必要这样做,因为我知道发生了什么。 fopen() 返回空值。我想知道为什么?
  • @Erik 我没有调查权限。但是当您添加需要权限的代码时,程序停止不为空。我说的对吗?
  • 不是真的...这取决于您的文件所在的位置。如果它位于公共区域或其中一个应用程序文件夹中,应该没问题。我建议你在这里阅读外部存储:developer.android.com/guide/topics/data/…

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


【解决方案1】:

我认为文件的权限实际上是0777

你添加了android.permission.READ_EXTERNAL_STORAGE,但你尝试打开写

FILE* fp = fopen("/storage/sdcard0/input.txt","w+");

您可以通过检查errno 来获取错误,并通过strerror 获取消息。

您必须打开文件以供 阅读 "r" 或添加写入权限 WRITE_EXTERNAL_STORAGE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2013-11-17
    • 2018-10-08
    • 2014-05-30
    • 2016-08-22
    相关资源
    最近更新 更多