【问题标题】:Problems only with reading a file in NDK, writing to a file is error free仅在 NDK 中读取文件时出现问题,写入文件没有错误
【发布时间】:2015-11-04 14:48:59
【问题描述】:

这个写入到文件的简单程序在我的模拟器中运行良好,因为我在 sdcard 中生成了一个文本文件(文本文件中包含 HELLO WORLD)以及给定的消息模拟器画面。

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                              jobject thiz )
{
    FILE* file = fopen("/sdcard/hello.txt","w+");

    if (file != NULL)
    {
        fputs("HELLO WORLD!\n", file);
        fflush(file);
        fclose(file);
    }

    return (*env)->NewStringUTF(env, "Hello from JNI (with file io)!");
}

但是当我尝试使用此程序读取文件时,我遇到了问题。它在模拟器屏幕或 logcat 上不输出任何内容。从上面的程序可以看出,sdcard 的位置或使用 FILE 操作肯定没有问题。如何解决?

JNIEXPORT jstring JNICALL Java_com_example_myproject_MainActivity_doSomething( JNIEnv* env, jobject thiz)
{
        // Counts the characters inside file

        char ch;
        int cnt= 0;
        FILE* fptr = fopen("/sdcard/hello.txt","r");

        while((ch=fgetc(fptr))!=EOF)
            cnt++;
        fclose(fptr);
        LOGE("cnt: %d",cnt);

        return (*env)->NewStringUTF(env, "Hello from JNI (with file io)!");

}

谢谢

编辑:

上述读取文件的代码在 linux gcc 中运行良好,但在 Android 中运行时出错。像 Andrew 所说的那样改变它可以解决它。

【问题讨论】:

    标签: android file android-ndk


    【解决方案1】:

    fgetc() 返回int,而不是char,所以这个循环永远不会终止:

        while((ch=fgetc(fptr))!=EOF)
            cnt++;
    

    因为ch 永远不能等于EOF

    【讨论】:

    • 如果 EOF 为 -1,它可以存储在 char 中——假设您的编译器默认将 char 视为有符号类型。我刚才尝试了一个像上面这样的简单示例,使用 linux/gcc,它运行良好。更改为unsigned char ch 导致它永远旋转。你的答案是正确的——ch 应该声明为int——但我不确定为什么 Android 在这方面表现不同。
    • @fadden:谢谢,它在 linux gcc 中运行良好,但在 android 中出现错误。这个错误显然让我在文件 IO 上工作了将近一周。呸!终于开始工作了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2020-06-25
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多