2013-08-08 8 views
5

Uso OBB per conservare i miei dati e devo utilizzare Android NDK per accedere ai dati. Tuttavia, non riesco a montare il file obb per recuperare i dati. Ho chiamato il mio obb dopo lo schema secondo APK Expansion Files documentation.Problemi nella lettura del contenuto del file OBB tramite Android NDK

esempio, main.1.com.example.native_activity.obb

Ho poi messo sotto cartella /data/Android/obb/com.example.native_activity come suggerito dal documento on-line di cui sopra.

Tuttavia, utilizzando il seguente codice, non posso fare montare l'obb:

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; 

Il obbPath risultato essere sempre vuoto. Non so come ottenere una chiave corretta, quindi era solo una randomizzazione.

UPDATE:

ho corretto due problemi da parte mia.

In primo luogo, il file obb non è stato creato utilizzando lo strumento jobb Android ma rinominato da un file zip. Così ho ricreato il file utilizzando:

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

e lo spinse sotto

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

Ho quindi utilizzato la chiave e una funzione di callback nella chiamata mountObb con codice come questo:

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; 

e il callback

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

L'uscita Logcat ho ottenuto:

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 

Secondo android-ndk-r8d/platforms/android-9/arch-arm/usr/include/android/storage_manager.h, il codice di errore dal callback significa

AOBB_STATE_MOUNTED = 1, 
AOBB_STATE_ERROR_ALREADY_MOUNTED = 24, 

Tuttavia, questo contraddice il logcat stampare del valore di ritorno di AStorageManager_isObbMounted() chiamata, che dice che non è ancora montato.

Sono totalmente confuso.

risposta

4

Risolto da solo.

C'è sicuramente qualcosa di controintuitivo sulle API di mount-query perché l'obb è stato montato in/mnt/obb/quando controllo il file system ma l'API continua a restituire 0 e si rifiuta di darmi il percorso. Probabilmente (la semantica del dettaglio non è documentata da nessuna parte) significa che la richiesta di THIS non è riuscita a far montare l'OBB anche se il file è già stato montato (codice di errore 24 dalla richiamata).

Quindi, se prima smonta il codice, dovrebbe essere corretto.Quindi, in pratica aggiungere questo:

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

prima

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

E con callback:

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); 
} 

l'uscita di successo:

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: Diversi altri colpi di scena che ho dovuto risolvere prima di ottenere questo al lavoro completamente:

  1. Quando si crea l'OBB utilizzando jobb, oltre a nominare correttamente il file, l'opzione -pv deve essere utilizzato con il versionCode corretto come in il manifest.
  2. Ogni volta che è necessario apportare un aggiornamento allo stesso OBB, ad es., VersionCode nel nome file OBB rimane lo stesso ma il contenuto è stato modificato, l'OBB già presente sul dispositivo deve essere rimosso in modo esplicito per primo. Altrimenti, un semplice OBB con push adb non funzionerà. Continuerai a ricevere il AOBB_STATE_ERROR_COULD_NOT_MOUNT (codice di errore 21) nel callback del mount. Ciò incoraggia l'utilizzo della versione ma rende difficile eseguire test ad hoc sullo stesso OBB, ovvero non è "consigliato" continuare a modificare l'OBB senza incrementare il versionCode. Ciò significa che è necessario cancellare prima l'OBB per "sovrascrivere" esattamente lo stesso file OBB.
  3. Molti tutorial si concentrano sull'insegnamento su come utilizzare la libreria di download e sul caricamento/download di musica da/su GooglePlay. È totalmente ignorabile se tutto ciò che si vuole fare è testare l'accesso OBB localmente.
+0

Grazie mille per aver dedicato il tuo tempo a scrivere questo, sto lottando con .obbs in questo momento, e questo è stato profondamente prezioso. Per altre persone che leggono questo, posso aggiungere che lo strumento jobb dà errori Fat Full se hai qualche file in qualche directory. Phew, lavorare con gli OBB è stato un inferno. –

+0

Una nota, sembra che si assuma che i callback siano eseguiti in modo sincronizzato, ma montare un OBB è (per quanto vedo) un'operazione asincrona. Potrebbe essere questo il motivo per cui stai ottenendo un percorso vuoto? (Nota al momento, non mi sembra di ricevere alcun callback, né il mio obb è montato ... debugging su ...) –

Problemi correlati