2013-08-08 66 views
5

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.

Trả lời

4

Tự khắc phục. Chắc chắn có điều gì đó phản trực giác về API truy vấn gắn kết vì obb đã được gắn dưới/mnt/obb/khi tôi kiểm tra hệ thống tệp nhưng API tiếp tục trả về 0 và từ chối cung cấp cho tôi đường dẫn. Có lẽ (ngữ nghĩa chi tiết không được ghi lại ở bất kỳ đâu) có nghĩa là NÀY rất yêu cầu đã không lấy được obb mặc dù tập tin đã được gắn trước đó (mã lỗi 24 từ cuộc gọi lại).

Vì vậy, nếu tôi ngắt kết nối trước tiên trước khi lắp lại vào mã, nó sẽ ổn.Vì vậy, về cơ bản thêm này:

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

trước

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

Và với 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); 
} 

đầu ra thành công:

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 

CẬP NHẬT: Vài hơn xoắn mà tôi đã phải sửa chữa trước khi nhận này để làm việc hoàn toàn:

  1. Khi tạo OBB sử dụng jobb, ngoài việc đặt tên cho các tập tin một cách chính xác, tùy chọn -pv phải được sử dụng với mã phiên bản đúng như trong tệp kê khai.
  2. Bất cứ khi nào cập nhật cần phải được thực hiện cho cùng OBB, ví dụ: mã phiên bản trong tên tệp OBB vẫn giữ nguyên nhưng nội dung đã thay đổi, OBB đã có trên thiết bị cần phải được loại bỏ rõ ràng trước. Nếu không, một OBB adb-push đơn giản sẽ không hoạt động. Bạn sẽ tiếp tục nhận được AOBB_STATE_ERROR_COULD_NOT_MOUNT (mã lỗi 21) trong cuộc gọi lại gắn kết. Điều này khuyến khích việc sử dụng phiên bản nhưng làm cho thử nghiệm ad-hoc trên cùng một OBB cứng, nghĩa là, nó không được "khuyến khích" để tiếp tục thay đổi OBB mà không tăng mã phiên bản. Điều này có nghĩa là bạn cần xóa OBB trước để "ghi đè lên" cùng một tệp OBB chính xác.
  3. Nhiều hướng dẫn tập trung vào việc dạy bạn cách sử dụng thư viện tải xuống và thực hiện tải lên/tải xuống khiêu vũ từ/đến GooglePlay. Nó hoàn toàn có thể bỏ qua nếu tất cả những gì bạn muốn làm là kiểm tra truy cập OBB cục bộ.
+0

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

+0

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

Các vấn đề liên quan