Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 仅在NDK中读取文件时出现问题,写入文件是无错误的_Android_File_Android Ndk - Fatal编程技术网

Android 仅在NDK中读取文件时出现问题,写入文件是无错误的

Android 仅在NDK中读取文件时出现问题,写入文件是无错误的,android,file,android-ndk,Android,File,Android Ndk,这个将写入文件的简单程序在我的模拟器中运行良好,因为我在SD卡中生成了一个文本文件(文本文件中包含HELLO WORLD)以及模拟器屏幕上的给定消息 jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz ) { FILE* file = fopen("/sdcard/hello.txt

这个将写入文件的简单程序在我的模拟器中运行良好,因为我在SD卡中生成了一个文本文件(文本文件中包含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)!");
}
但是当我试图用这个程序读取文件时,我遇到了问题。它在emulator屏幕或logcat上不输出任何内容。从上面的程序可以看出,SD卡的位置或使用文件操作绝对没有问题。如何修复它

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所述更改它可以解决此问题。

fgetc()
返回
int
,而不是
char
,因此此循环永远不会终止:

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

因为
ch
永远不能等于
EOF

如果EOF为-1,它可以存储在
char
中——假设编译器默认将
char
视为有符号类型。我刚才用linux/gcc尝试了一个简单的例子,效果很好。更改为
无符号字符ch
会导致它永远旋转。您的答案是正确的--
ch
应该声明为
int
--但我不确定为什么Android在这方面表现不同。@fadden:谢谢,它在linux gcc中运行良好,但在Android中出现了错误。这个错误显然让我花了将近一周的时间来处理文件IO。呸!终于开始工作了。