1

1 つのネイティブ コールに次のコードがあることを確認してください

errno = 0;

FILE *fp;
fp = fopen("jigar.txt","wb");
if(fp == NULL)
    __android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN FAIL with %d",errno);
else
    __android_log_print(ANDROID_LOG_ERROR, APPNAME, "FOPEN pass "); 

失敗して表示されます

FOPEN FAIL with 30

ここで 30 は、エラーを示していることを意味します

#define EROFS       30  /* Read-only file system */

アプリケーションの MainFest ファイルに、この行を追加しました

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >

それでも私はこのエラーが発生しています..

この問題を解決するにはどうすればよいですか?


編集

フォルダ名を指定することで感謝しますが、動作します

私の場合、ファイル名を指定できない fopen() 呼び出しを持つライブラリが 1 つあります。デフォルトのファイル名を取ります。

そして、私はndkアプリケーションでこのライブラリを使用しています。この場合、これを解決するにはどうすればよいですか?

4

3 に答える 3

1

デフォルトでは、アプリを実行すると、独自のコンテキストで実行されます。fopen("jigar.txt","wb"); 現在のディレクトリでファイルを開こうとしますが、これはほとんど /data/.. になると思います。したがって、そのようなファイルを作成することはできません。代わりに、/data/ 内にフォルダーが必要な場合は、関数 gteDir() を呼び出すことができ、その中に独自のファイルを作成できます。これは一般的な情報です。

問題になると、上記のように、別のディレクトリにファイルを作成するには絶対パスを指定する必要があります。これは Linux でも同様です。

Library については、2 つのことができます。

1) ライブラリのソース コードを変更し、NDK を使用して再度コンパイルします。変更を行う際、アプリケーションの実行中に渡す fopen() の引数として文字列を指定します。

2)ライブラリがファイルを作成しているファイルシステムを再マウントしてから、ファイルが作成されている特定のディレクトリに対して chmod 777 を実行します。次に、アプリケーションを実行します。それはうまくいくはずです。しかし、これは一般的ではありません。テスト目的で実行している場合、このソリューションは最も簡単で時間を節約できます...

どこかで立ち往生している場合は、私に知らせてください..

于 2012-04-25T08:14:10.070 に答える
0

ゆっぴやっとわかった

私はこのようにしました

まず、プロセスの現在のディレクトリをから"/"に変更します"/sdcard/"

chdir("/sdcard/");

そして、/sdcard/ に関するパスを見つけます

そしてすべてが機能しています.. !!!

于 2012-04-25T08:13:55.113 に答える
0

「jigar.txt」ファイルを書き込むフォルダを指定する必要があります。このような:

fp = fopen("/sdcard/figar.txt", "wb");
于 2012-04-25T07:48:25.927 に答える