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 出力と矛盾します。
私は完全に混乱しています。