6

OBB を使用してデータを保持し、Android NDK を使用してデータにアクセスする必要があります。ただし、データを取得するためにobbファイルをマウントできないようです。APK Expansion Files documentationに従って、スキームに基づいて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常に空であることが判明しました。適切なキーを取得する方法がわからないため、ランダム化にすぎませんでした。

更新

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

まず、obb ファイルは Android の jobb ツールを使用して作成されたのではなく、zip ファイルから名前が変更されました。そこで、次を使用してファイルを再作成しました。

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/

次に、mountObb 呼び出しでキーとコールバック関数を次のようなコードで使用しました。

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;

そしてコールバック

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

1 に答える 1

6

自分で解決しました。

ファイル システムをチェックすると、obb が /mnt/obb/ の下にマウントされているにもかかわらず、API が 0 を返し続け、パスの提供を拒否するため、mount-query API について直感に反するものがあることは間違いありません。おそらく(詳細なセマンティックはどこにも文書化されていません)、ファイルは以前にマウントされていましたが(コールバックからのエラーコード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

更新:これを完全に機能させる前に修正しなければならなかったさらにいくつかのひねり:

  1. を使用して OBB を作成する場合jobb、ファイルに正しい名前を付けることに加えて-pv、マニフェストのように正しい versionCode でオプションを使用する必要があります。
  2. 同じ OBB を更新する必要がある場合、たとえば、OBB ファイル名の versionCode は同じままでコンテンツが変更された場合は常に、デバイスに既に存在する OBB を最初に明示的に削除する必要があります。そうしないと、単純な adb プッシュ OBB は機能しません。AOBB_STATE_ERROR_COULD_NOT_MOUNTマウント コールバックで (エラー コード 21) を取得し続けます。これにより、バージョン管理が促進されますが、同じ OBB でのアドホック テストが困難になります。つまり、versionCode をインクリメントせずに OBB を変更し続けることは「推奨」されません。つまり、最初に OBB を削除して、まったく同じ OBB ファイルを「上書き」する必要があります。
  3. 多くのチュートリアルでは、ダウンロード ライブラリの使用方法と、GooglePlay への/からのアップロード/ダウンロード ダンスの実行に焦点を当てています。ローカルで OBB アクセスをテストするだけなら、まったく無視できます。
于 2013-08-09T17:43:35.973 に答える