2014-09-30 17 views
0

問題與"android ndk data save/load"幾乎相同,如果您開發純本機應用程序,該問題會得到非常好的和令人滿意的答案。但我正在寫一個本地圖書館。好的,回到問題:在原生Android庫中保存/加載數據

我編寫了一個Java庫來處理我的服務器連接。在庫中我想加載和保存與App相關的二進制數據。在上面的答案中有一個好方法,即「internalDataPath」。遺憾的是的

struct android_app* state 

,我沒有因爲庫,因爲它是提供給本機主要機能的研究參數的一部分。我只有

JNIEnv * 

JavaVM * 

我怎麼從他們那裏得到的一個internalDataPath?

回答

0

主要問題是如果您製作純NDK解決方案,則缺失的活動對象通過主系統中的android_app結構提供給您。如果您只想創建一個可供Java開發人員使用的庫,則無法通過調用向您提供主要活動。或者,更確切地說,我沒有找到一種方法從我的C++代碼中獲取Java應用程序的主要活動。這讓我兩個選擇:

1)使用getFilesPath從Java調用,使其成爲c的方法調用++對象(也許是「初始化」)

2)給出的主要活動於C++的一部分代碼(也許在「init」中)。

我決定爲第二個。首先,我不想控制Java部分的程序員在哪裏放置什麼。其次,我覺得我會需要更多理由的活動。

void here_your_ndk_conform_name_init(JNIEnv* env,jobject mainactivity) 
{ 
    jclass cls = env->GetObjectClass(mainactivity); 
    jmethodID getFilesDir = env->GetMethodID(cls, "getFilesDir", "()Ljava/io/File;"); 
    jobject dirobj = env->CallObjectMethod(mainactivity,getFilesDir); 
    jclass dir = env->GetObjectClass(dirobj); 
    jmethodID getStoragePath = 
          env->GetMethodID(dir, "getAbsolutePath", "()Ljava/lang/String;"); 
    jstring path=(jstring)env->CallObjectMethod(dirobj, getStoragePath); 
    const char *pathstr=env->GetStringUTFChars(path, 0); 
    std::string strPath=pathstr; 
    env->ReleaseStringUTFChars(path, pathstr); 
} 

其中strPath的現在擁有的路徑,你可以自由地與輸入輸出流訪問內部存儲:

所以我從Jong Wook Kim剪斷一個代碼,我修改了我的需求而告終。

0

我相信這已經被覆蓋過,但通常的建議是使用Java API獲取內部或外部存儲的路徑 - 在第一次調用時將其傳遞到本地代碼中,或者使用JNI反向「從本地代碼調用Java API(儘管您可能需要一個Context)。

-1

如果數據是特定於應用程序的,最好讓應用程序決定其數據的存儲位置。如果數據對於庫是「私有」的(特別是如果數據在不同的應用程序中可能會在同一設備上使用您的庫),請隨意選擇/ sdcard/data的子目錄。請注意,通過這種方式您可以強制應用程序請求相關權限。