Tôi sử dụng OBB để giữ dữ liệu của mình và cần sử dụng NDK của Android để truy cập dữ liệu. Tuy nhiên, tôi không thể có vẻ để gắn kết các tập tin obb để lấy dữ liệu. Tôi đặt tên cho obb của tôi sau sơ đồ theo APK Expansion Files documentation.Gặp sự cố khi đọc nội dung tệp OBB bằng cách sử dụng Android NDK
ví dụ main.1.com.example.native_activity.obb
sau đó tôi đặt nó trong thư mục /data/Android/obb/com.example.native_activity theo đề nghị của các doc trực tuyến ở trên.
Tuy nhiên, bằng cách sử dụng đoạn mã sau, tôi không thể thực hiện gắn kết 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;
Các obbPath
hóa ra là luôn luôn có sản phẩm nào. Tôi không biết làm thế nào để có được một chìa khóa thích hợp vì vậy nó chỉ là một ngẫu nhiên.
CẬP NHẬT:
tôi sửa chữa hai vấn đề từ bên cạnh tôi.
Đầu tiên, tệp obb không được tạo bằng công cụ jobb của Android nhưng được đổi tên từ tệp zip. Vì vậy, tôi tái tạo các tập tin sử dụng:
jobb -d assets/ -o obb/main.1.com.example.native_activity.obb -k mykey -pn com.example.native_activity -pv 11
Và đẩy nó dưới
/sdcard/Android/obb/com.example.native_activity/
sau đó tôi sử dụng chìa khóa và một hàm callback trong cuộc gọi mountObb với mã như thế này:
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;
và gọi lại
void my_obbCallbackFunc(const char* filename, const int32_t state, void* data)
{
LOGI("my_obbCallbackFunc: %d", state);
}
Sản lượng Logcat tôi nhận:
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
Theo android-ndk-r8d/platforms/android-9/arch-arm/usr/include/android/storage_manager.h
, mã lỗi từ callback nghĩa
AOBB_STATE_MOUNTED = 1,
AOBB_STATE_ERROR_ALREADY_MOUNTED = 24,
Tuy nhiên, điều này mâu thuẫn với logcat in ra giá trị trở lại của AStorageManager_isObbMounted() cuộc gọi, mà đọc rằng nó chưa được gắn kết.
Tôi hoàn toàn bối rối.
Cảm ơn bạn đã dành thời gian viết bài này, tôi đang đấu tranh với .obbs ngay bây giờ và điều này có giá trị sâu sắc. Đối với những người khác đọc sách này, tôi có thể thêm rằng công cụ jobb cung cấp lỗi Fat Full nếu bạn có quá ít tệp trong một số thư mục. Phew, làm việc với obbs là một địa ngục. –
Một lưu ý, có vẻ như bạn cho rằng các cuộc gọi lại được thực hiện đồng bộ, nhưng việc gắn một obb là (theo như tôi thấy) một hoạt động không đồng bộ. Đây có phải là lý do bạn đang nhận được một con đường trống không? (Lưu ý hiện tại, tôi dường như không nhận được bất kỳ lời gọi nào cả, cũng không phải là obb của tôi được gắn ... gỡ lỗi trên ...) –