2013-08-08 19 views
5

Ich benutze OBB, um meine Daten zu halten und müssen Android NDK verwenden, um auf die Daten zuzugreifen. Ich kann jedoch nicht scheinen, die OBB-Datei zu mounten, um Daten abzurufen. Ich benenne meinen Obb nach dem Schema nach APK Expansion Files documentation.Problem beim Lesen von OBB-Datei Inhalt mit Android NDK

z.B. main.1.com.example.native_activity.obb

ich es dann unter /data/Android/obb/com.example.native_activity Ordner abgelegt, wie oben durch die Online-doc vorgeschlagen.

jedoch durch den folgenden Code verwenden, kann ich nicht die OBB montieren machen:

AStorageManager* man = AStorageManager_new(); 
char* data = malloc(256); 
AStorageManager_mountObb(man, "main.1.com.example.native_activity.obb", "somekey", my_obbCallbackFunc, data); 
char* obbPath = AStorageManager_getMountedObbPath(man, "main.1.com.example.native_activity.obb"); 

LOGI("mounted path: %s", obbPath); 
free(data); 
data = NULL; 
AStorageManager_delete(man); 
man = NULL; 

Die obbPath drehte immer leer sein wird. Ich weiß nicht, wie man einen richtigen Schlüssel bekommt, also war es nur eine Randomisierung.

UPDATE:

korrigierte ich zwei Fragen von meiner Seite.

Zunächst wurde die obb-Datei nicht mit dem Android-Jobb-Tool erstellt, sondern aus einer Zip-Datei umbenannt. So neu erstellt ich die Datei mit:

jobb -d assets/ -o obb/main.1.com.example.native_activity.obb -k mykey -pn com.example.native_activity -pv 11 

und schob es unter

/sdcard/Android/obb/com.example.native_activity/ 

habe ich dann den Schlüssel und eine Rückruffunktion im mountObb Anruf mit Code wie folgt:

char obbPath[256]; 
sprintf(obbPath, "/sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb"); 
struct stat sts; 
if(stat(obbPath, &sts) == -1) 
{ 
    LOGI("File not found: %s\n", obbPath); 
} 
else 
{ 
    LOGI("File found: %s", obbPath); 
} 

AStorageManager* man = AStorageManager_new(); 
char* data = malloc(256); 
AStorageManager_mountObb(man, obbPath, "mykey", my_obbCallbackFunc, data); 
char* mntPath = AStorageManager_getMountedObbPath(man, obbPath); 

int isMounted = AStorageManager_isObbMounted(man, obbPath); 

LOGI("mounted path: %s, already mounted?: %d", mntPath, isMounted); 
free(data); 
data = NULL; 
AStorageManager_delete(man); 
man = NULL; 
return 1; 

und der Rückruf

void my_obbCallbackFunc(const char* filename, const int32_t state, void* data) 
{ 
    LOGI("my_obbCallbackFunc: %d", state); 
} 

Die Logcat Ausgabe Ich habe:

08-09 08:45:15.960: I/native-activity(9166): Touched screen. 
08-09 08:45:15.960: I/native-activity(9166): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb 
08-09 08:45:15.960: E/Parcel(9166): Reading a NULL string not supported here. 
08-09 08:45:15.960: I/native-activity(9166): mounted path: , already mounted?: 0 
08-09 08:45:15.970: I/native-activity(9166): Touched screen. 
08-09 08:45:15.970: I/native-activity(9166): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb 
08-09 08:45:15.970: E/Parcel(9166): Reading a NULL string not supported here. 
08-09 08:45:15.970: I/native-activity(9166): mounted path: , already mounted?: 0 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 1 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24 
08-09 08:45:16.030: I/native-activity(9166): my_obbCallbackFunc: 24 

Nach android-ndk-r8d/platforms/android-9/arch-arm/usr/include/android/storage_manager.h, der Fehlercode aus dem Callback bedeutet

AOBB_STATE_MOUNTED = 1, 
AOBB_STATE_ERROR_ALREADY_MOUNTED = 24, 

Dies ist jedoch die logcat widerspricht aus dem Rückgabewert von AStorageManager_isObbMounted() -Aufruf drucken, Das liest, dass es noch nicht gemountet ist.

Ich bin total verwirrt.

Antwort

4

Ich habe es selbst gelöst.

Es gibt definitiv etwas kontraintuitiv zu den mount-query-APIs, weil der Obb unter/mnt/obb/angehängt wurde, wenn ich das Dateisystem überprüfe, aber die API immer 0 zurückgibt und mir den Pfad verweigert. Es wahrscheinlich (die Detail Semantik ist nirgendwo dokumentiert) bedeutet, dass THIS sehr Anfrage hat es nicht geschafft, das Obb eingehängt bekommen, obwohl die Datei bereits zuvor montiert wurde (Fehlercode 24 aus dem Rückruf).

Also wenn ich zuerst unmount vor der Montage wieder in den Code sollte es in Ordnung sein.Also im Grunde hinzufügen:

AStorageManager_unmountObb(man, obbPath, 1, my_obbCallbackFunc, data); 

vor

AStorageManager_mountObb(man, obbPath, "mykey", my_obbCallbackFunc, data); 

Und mit Rückruf:

void my_obbCallbackFunc(const char* filename, const int32_t state, void* data) 
{ 
    LOGI("my_obbCallbackFunc: %d", state); 

    AStorageManager* man = AStorageManager_new(); 
    int isMounted = AStorageManager_isObbMounted(man, filename); 
    char* mntPath = AStorageManager_getMountedObbPath(man, filename); 

    LOGI("my_obbCallbackFunc: fn: %s: mounted path: %s, already mounted?: %d", filename, mntPath, isMounted); 
    AStorageManager_delete(man); 
} 

die erfolgreiche Ausgabe:

08-09 10:41:53.060: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb 
08-09 10:41:53.070: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.070: I/native-activity(10753): mounted path: , already mounted?: 0 
08-09 10:41:53.080: I/native-activity(10753): Touched screen. 
08-09 10:41:53.080: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb 
08-09 10:41:53.110: I/native-activity(10753): my_obbCallbackFunc: 2 
08-09 10:41:53.110: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.110: I/native-activity(10753): mounted path: , already mounted?: 0 
08-09 10:41:53.110: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.110: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0 
08-09 10:41:53.110: I/native-activity(10753): Touched screen. 
08-09 10:41:53.110: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb 
08-09 10:41:53.110: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.110: I/native-activity(10753): mounted path: , already mounted?: 0 
08-09 10:41:53.130: I/native-activity(10753): Touched screen. 
08-09 10:41:53.130: I/native-activity(10753): File found: /sdcard/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb 
08-09 10:41:53.130: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.130: I/native-activity(10753): mounted path: , already mounted?: 0 
08-09 10:41:53.260: I/native-activity(10753): my_obbCallbackFunc: 1 
08-09 10:41:53.300: I/native-activity(10753): my_obbCallbackFunc: 2 
08-09 10:41:53.300: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.300: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 1 
08-09 10:41:53.300: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.300: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0 
08-09 10:41:53.490: I/native-activity(10753): my_obbCallbackFunc: 1 
08-09 10:41:53.520: I/native-activity(10753): my_obbCallbackFunc: 2 
08-09 10:41:53.520: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.520: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0 
08-09 10:41:53.520: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.520: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 1 
08-09 10:41:53.680: I/native-activity(10753): my_obbCallbackFunc: 1 
08-09 10:41:53.720: I/native-activity(10753): my_obbCallbackFunc: 2 
08-09 10:41:53.720: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.720: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 1 
08-09 10:41:53.720: E/Parcel(10753): Reading a NULL string not supported here. 
08-09 10:41:53.720: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: , already mounted?: 0 
08-09 10:41:53.870: I/native-activity(10753): my_obbCallbackFunc: 1 
08-09 10:41:53.880: I/native-activity(10753): my_obbCallbackFunc: fn: /storage/Android/obb/com.example.native_activity/main.1.com.example.native_activity.obb: mounted path: /mnt/obb/437f5d6d13a1da1d3b41bb46963e3720, already mounted?: 1 

UPDATE: Mehrere mehr Drehungen, die ich, bevor man dieses Problem beheben musste komplett arbeiten:

  1. Wenn die OBB jobb mit der Erstellung, zusätzlich, um die Datei korrekt zu benennen, die -pv Option mit der richtigen version verwendet werden muss, wie in das Manifest.
  2. Immer wenn eine Aktualisierung an denselben OBB vorgenommen werden muss, z. B. der versionCode im OBB-Dateinamen bleibt gleich, aber der Inhalt hat sich geändert, muss die OBB, die sich bereits auf dem Gerät befindet, explizit zuerst entfernt werden. Andernfalls funktioniert ein einfacher adb-geschobener OBB nicht. Sie erhalten die AOBB_STATE_ERROR_COULD_NOT_MOUNT (Fehlercode 21) in Ihrem Mount-Callback. Dies fördert die Versionierung, macht aber Ad-hoc-Tests am selben OBB schwierig, d. H. Es ist nicht "empfohlen", den OBB unverändert zu lassen, ohne den Versionscode zu erhöhen. Das bedeutet, dass Sie den OBB zuerst löschen müssen, um genau die gleiche OBB-Datei zu "überschreiben".
  3. Viele Tutorials konzentrieren sich darauf, Ihnen beizubringen, wie Sie die Download-Bibliothek verwenden und den Upload/Download-Tanz zu/von GooglePlay durchführen. Es ist völlig ignorierbar, wenn Sie nur OBB lokal testen möchten.
+0

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu schreiben. Ich habe gerade Probleme mit .obbs. Das war sehr wertvoll. Für andere Leute, die dies lesen, kann ich hinzufügen, dass das Jobb-Tool Fat Full-Fehler gibt, wenn Sie zu wenige Dateien in einem Verzeichnis haben. Puh, mit Obbs zu arbeiten war eine Hölle. –

+0

Eine Anmerkung, es scheint, Sie nehmen an, dass die Callbacks synchron ausgeführt werden, aber das Mounten eines Obb ist (so weit ich sehe) eine asynchrone Operation. Könnte das der Grund sein, dass du einen leeren Weg hast? (Momentan, ich habe anscheinend keine Callbacks, auch ist mein Obb nicht geladen ... Debugging ...) –