2013-08-08 28 views
5

OBBを使用してデータを保持し、Android NDKを使用してデータにアクセスする必要があります。しかし、データを取得するためにobbファイルをマウントすることはできません。私はAPK Expansion Files documentationに従って計画の後に私のobbの名前をつけます。Android NDKを使用してOBBファイルの内容を読むときに問題が発生する

例えば、main.1.com.example.native_activity.obb

上記のオンラインドキュメントで示唆したように、私はその後、/data/Android/obb/com.example.native_activityフォルダの下に置きます。

ただし、次のコードを使用して、私は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; 

obbPathは常に空であることが判明。 私は正しいキーを取得する方法を知らないので、それは単なるランダム化でした。

UPDATE

私は私の側から二つの問題を修正しました。

最初に、obbファイルはAndroidのjobbツールを使用して作成されず、zipファイルから名前が変更されました。

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; 

:私は、キーと、このようなコードでmountObb呼び出しでコールバック関数を使用

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

をそして

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

の下でそれをプッシュ:だから私は使用してファイルを再作成しましたコールバック

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

Logcat出力は、私が得た:

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 

android-ndk-r8d/platforms/android-9/arch-arm/usr/include/android/storage_manager.hによると、コールバックからのエラーコードが

AOBB_STATE_MOUNTED = 1, 
AOBB_STATE_ERROR_ALREADY_MOUNTED = 24, 

を意味しかし、これは、AStorageManager_isObbMounted()呼び出しの戻り値のうち、logcatプリントを矛盾しますそれはまだマウントされていないことを読み取る。

私は完全に混乱しています。

答えて

4

自分で解決しました。

ファイルシステムをチェックするとobbが/ mnt/obb /の下にマウントされているが、APIが0を返し続け、私にパスを与えることを拒否しているため、mount-query APIについては直感的なことがあります。 THISファイルが既にマウントされていても(コールバックからのエラーコード24)、非常にリクエストがobbのマウントに失敗している可能性があります(詳細セマンティックはどこにも記載されていません)。

コードに再度マウントする前に最初にアンマウントするとうまくいくはずです。

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

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

とコールバックを持つ:

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

成功出力:

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したがって、基本的にこれを追加します。

  1. 正しくファイルに名前を付けることに加えて、jobbを使用してOBBを作成し、-pvオプションのように正しいversionCodeと一緒に使用する必要があります:私はこれは完全に動作するように取得する前に修正しなければならなかった いくつかのより多くのねじれマニフェスト
  2. OBBファイル名のversionCodeは同じですが内容は変更されているなど、同じOBBに更新する必要がある場合は常に、デバイス上のOBBを最初に明示的に削除する必要があります。そうしないと、単純なADBプッシュOBBは機能しません。マウントコールバックにAOBB_STATE_ERROR_COULD_NOT_MOUNT(エラーコード21)が表示され続けます。これにより、バージョン管理された使用が促進されますが、同じOBBに対してアドホックテストが難しくなります。つまり、versionCodeを増やすことなくOBBを変更し続けるのは「推奨」しません。つまり、まったく同じOBBファイルを上書きするには、最初にOBBを削除する必要があります。
  3. 多くのチュートリアルでは、ダウンロードライブラリを使用してGooglePlayとの間でアップロード/ダウンロードダンスを行う方法を教えることに焦点を当てています。あなたがしたいのは、OBBのローカルアクセスをテストすることだけです。
+0

これを書いていただきありがとうございます、私は今、.obbsと闘っており、これは非常に貴重です。これを読んでいる他の人には、あるディレクトリにファイルが少なすぎると、jobbツールがFat Fullエラーを出すと付け加えることができます。ピーは、つまようじで働いていました。 –

+0

ひとつは、コールバックが同期して実行されていると思われますが、obbをマウントすることは(私が見る限り)非同期操作です。これがあなたの空の道を得た理由かもしれませんか? (現時点では、コールバックをまったく受け取っていないようですが、私のobbはマウントされていません...デバッグ...) –

関連する問題