2011-01-19 47 views
14

SDカード以外の場所にファイルを書き込む方法はありますか?Android NDK書き込みファイル

私は、ファイルシステム上の多くの別のパスを試してみましたが、常に

はと同等の何か他のものがあります...私は/ SDカード/内部での読み出し/書き込みを任意のファイルを除いて、NULLを返す関数fopen:

ファイルシステムなどのように書くことができますか?

+0

このリンクでは次のように答えています: vgokul129

答えて

5

あなたのアプリ内の2つの場所、SDCard、およびあなたのアプリ用の特別なデータディレクトリにアクセスできます。あなたがroot権限を持っていない限り、他の場所は制限されていません。

+0

"特別なデータディレクトリ"の場所はどこですか? ?私はすべての携帯電話がSDカードを持っているわけではないと思っています。だから/ sdcard/dir。信頼できません。 TIA – bobmc

+1

次のコマンドを使用して、ディレクトリがJavaにあるOSを問い合わせることができます。 mContext.getFilesDir(); mContext.getExternalFilesDir(null); デバイスには内部ストレージが限られている可能性があるため、大きなオブジェクトの場合は外部ストレージを優先する必要があります。 – CaseyB

+0

私はデバイスへのルートアクセス権を持っています。ファイルシステムへのアクセス方法を教えてください。システムでファイルを開こうとしているが、私のために働いていない。これを確認してください[リンク](http://stackoverflow.com/questions/39785497/accessing-root-files-system-dev-from-a-native-library-in-android-applicatio) – Arjun

17
  1. あなたのアプリが配置されているディレクトリ にいつでもアクセスできます。

    このディレクトリは通常、次のとおりです。

    data/data/<Your_package_name_usually com.android.appName>/files/<your_filename>

    より良いアンドロイドの未来 バージョンの変更で有効なファイルパスを確保 にgetFilesDir()を使用しています。あなたの代わりに外部ストレージ を使用したい場合は

  2. 、あなたは ゲイン許可にマニフェストのアプリのコードのこの ラインを置くことを確認してください。

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

    そして、SDカードのディレクトリを使用します。

    getExternalStorageDirectory(); //usually : /sdcard/<your_filename>

  3. そうでない場合、あなたはデバイス を根絶し、全体 ファイルシステムへのアクセスを得ることができます。しかし、アプリケーションを使用して の前に のすべてのアプリユーザーに のルートアクセス権を取得するようにリクエストする必要があります。いくつかのゲーム はこのやり方を使いますが、私は を勧めません。まだ としたい場合は、アンドロイドのSuperuser アプリを参照してください。無料で を信頼できます。

これでアンドロイドディレクトリが作成されたら、jstringパラメータを受け取るJNIネイティブメソッドを作成し、ネイティブコード内に設定します。それをstd :: stringに変換すると、fopen()で使用する準備が整います。

//Inside your java activity 
File f = this.getApplicationContext().getFilesDir(); 
LibLoader.setupArchiveDir(f.toString()); 

//Inside your JNI wrapper 
JNIEXPORT bool JNICALL Java_com_android_appName_LibLoader_setupArchiveDir(JNIEnv * env, jobject obj, jstring dir) 
{ 
     const char* temp = env->GetStringUTFChars(dir, NULL); 
    std::string stringDir(temp); 

     // Will be receive as a std::string inside C++ code 
    MyNativeObjectInC++->SetupArchiveDir(stringDir); 
} 

編集:

あなたがてmanualyする必要があるかもしれませんが、初めてでそれを使用できるようになる前にCで/ファイルを作成します。

int result_code = mkdir("/data/data/com.app/files/", 0770)

乾杯!

+0

'0770'のフラグ最後のコードサンプルで。 'mkdir("/data/data/com.app/databases "、S_IRWXU | S_IRWXG | S_IWOTH | S_IXOTH);'私にとってはうまくいかない:( – amin

-1

fopen(filePath, "a+")機能を使用する前にファイルを作成する必要があります。または使用するfopen(filePath, "a")

関連する問題