【问题标题】:android file operation,open, failsandroid文件操作,打开,失败
【发布时间】:2012-06-02 11:31:51
【问题描述】:

我正在使用ndk工具链构建以下代码来测试android的文件操作能力。 并且,在 /data 中,读或写的权限无疑是 Ok 的。但是,我对为什么 fopen() 不起作用并返回 NULL 感到困惑。 代码如下:

#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void main()
{
    int fd;
    int count = 128;
    int offset = 32;
    int ret;
    char buf[1024]="hi ! this is pwrite.";
    char pathname[128] = "/data/pwrite.txt";
    /*fd = fopen(pathname, O_WRONLY);*/
    FILE *infile;
    infile = fopen(pathname, "rb");
    if(infile==NULL) printf("fopen error  \n");
    /*if(fd==-1)printf("open error \n");*/
    if((ret = pwrite(fd, buf, count, offset))==-1)
    {
        printf("pwrite error\n");
        exit(1);
    }
    else
    {
        printf("pwrite success\n");
        printf("the writed data is:%s", buf);
    }
}

我直接在Android中运行代码时,提示如下:

# ./test
fopen error  
pwrite error

有什么想法吗?

【问题讨论】:

  • 试试 char pathname[128] = "//data//pwrite.txt";
  • 我尝试了你的想法,但它也失败了。但是,无论如何。还有其他想法吗?
  • 好的,请试试这个infile = fopen( *pathname, "rb");
  • jni/test.c:16: 警告:传递 'fopen' 的参数 1 使指针从整数而不进行强制转换 /home/kaiwii/android-ndk-r7/platforms/android-14/arch -arm/usr/include/stdio.h:232:注意:预期为“const char *”,但参数的类型为“char”
  • 您是否在 AndroidManifest.xml 中授予此权限 `' ?

标签: android linux android-ndk embedded-linux


【解决方案1】:

你在打开文件时给了rb模式,这只是意味着读取二进制文件。现在您正在执行错误的write 操作。你应该给写模式如下,

infile = fopen(pathname, "wb");

【讨论】:

    【解决方案2】:

    除了你的文件模式问题,

    "/data/pwrite.txt"
    

    不应是 android 应用程序用户 ID 或什至(在安全设备上)adb shell 用户可访问的写入位置。

    大约从 android 2.2 开始(但随时可能更改),adb shell 用户可以将 /data/local 用作暂存区。对于应用程序中的代码,每个应用程序用户 ID 都有它自己的包唯一私有存储区域,可通过其中一个 java 级别的 api 调用找到 - 我认为它类似于 getFilesDir() - 你真的应该使用它来实现可移植性而不是硬编码路径.

    WRITE_EXTERNAL_STORAGE 权限仅在您希望使用“外部存储”(取决于可能被焊接的设备或实际的可移动卡)而不是内部存储时才相关。同样,您应该通过 api 调用真正获取设备特定路径,而不是不可移植地假设它类似于 /mnt/sdcard

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      相关资源
      最近更新 更多