2011-01-19 58 views
14

有沒有其他方法可以將文件寫入SD卡以外的地方?Android NDK寫入文件

我嘗試了許多不同的路徑上的文件系統,但是總的fopen返回NULL,除了裏面讀到我寫的任何文件/中/ SD卡/ ...

有別的等價於:

這可以讓你寫在文件系統或類似的東西?

+0

回答此鏈接: vgokul129 2014-10-08 08:36:02

回答

5

您可以訪問應用程序內的兩個位置,SDCard和應用程序的特殊數據目錄。除非您有root權限,否則任何其他地方都是禁用的。

+0

那裏的「特殊數據目錄」的位置在哪裏? ?因爲我假設並非所有的手機都有SD卡......所以/ sdcard/dir。是不可靠的。 TIA – bobmc 2011-01-19 04:52:42

+1

您可以使用以下命令詢問目錄在Java中的操作系統: mContext.getFilesDir(); mContext.getExternalFilesDir(null); 由於設備的內部存儲空間有限,因此您應該傾向於使用大型對象的外部存儲。 – CaseyB 2011-01-19 17:41:20

17
  1. 您可以隨時訪問您的應用程序所在的目錄 。

    這個目錄通常是:

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

    但更好地利用getFilesDir()以 確保與Android的未來 版本變化的有效文件路徑。

  2. 如果你想使用外部存儲 代替,請務必把這個 行代碼在您的應用程序清單以 增益許可。

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

    然後使用SD卡目錄:

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

  3. 否則,您可以用root設備 並獲得整個 文件系統訪問。但是您必須要求 請求您的所有應用用戶在使用您的應用的 之前在其設備上獲得 根訪問權限。有些遊戲 使用這種方式做事,但我 不會推薦它。如果你仍然 想要做到這一點,查找Superuser 應用程序爲Android,它是免費的,並且 值得信賴。

一旦你擁有了Android目錄,只是創建接收的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)

乾杯!

-1

必須在使用fopen(filePath, "a+")函數之前創建文件。或者使用fopen(filePath, "a")