2015-11-04 82 views
1

这个简单程序到写入成文件在我的模拟器中运行正常,因为我得到的文本文件在SD卡内生成(文本文件有HELLO WORLD)以及仿真器屏幕上的给定消息。只读NDK文件时写入文件时出错无错

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所提到的改变它解决了它。

回答

1

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

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

因为ch绝不能等于EOF

+1

如果EOF为-1,则可以将其存储在'char'中 - 假设您的编译器默认将'char'视为带符号的类型。我刚才尝试了一个简单的例子,使用linux/gcc,它工作正常。更改为'unsigned char ch'导致它永远旋转。你的回答是正确的 - 'ch'应该声明为'int' - 但我不确定为什么Android在这方面表现不同。 – fadden

+0

@fadden:谢谢,它在linux gcc中运行良好,但在android中发生错误。这个错误显然使我在文件IO上工作了将近一周。唷!终于搞定了。 – re3el