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プリントを矛盾しますそれはまだマウントされていないことを読み取る。
私は完全に混乱しています。
これを書いていただきありがとうございます、私は今、.obbsと闘っており、これは非常に貴重です。これを読んでいる他の人には、あるディレクトリにファイルが少なすぎると、jobbツールがFat Fullエラーを出すと付け加えることができます。ピーは、つまようじで働いていました。 –
ひとつは、コールバックが同期して実行されていると思われますが、obbをマウントすることは(私が見る限り)非同期操作です。これがあなたの空の道を得た理由かもしれませんか? (現時点では、コールバックをまったく受け取っていないようですが、私のobbはマウントされていません...デバッグ...) –