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.
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. –
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 ...) –