Доступ к данным Android APK актива непосредственно в C ++ без Asset Manager и копирования

Я использую чистый C ++ в своем движке для создания игрового движка в Android. Там нет ни одного файла Java. По сути, это игра, которая должна храниться только во внешней памяти. Когда я вручную перемещаю данные об активах через adb на мою внешнюю SD-карту, игра уже работает нормально и стабильно.

<code>adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/
</code>

Это не хорошее решение, потому что оно не может быть доставлено. Поэтому у меня есть мои активы-данные в папке активов который перемещается в файл apk во время процесса сборки со следующей структурой:

Активы / Data / MoreFolders / Withsubfolders Активы / Data / EngineData.zip Активы / Data / ScriptData.zip

Но я не знаю, где эти файлы находятся в файловых системах для доступа к ним в коде c ++.

Поэтому я попытался получить путь к каталогам файлов. И из-за ошибки в родном состоянии активности Я должен получить информацию в обычном коде.

<code>// bug in 2.3 internalDataPath / externalDataPath = null using jni code instead
//FHZ_PRINTF("INTERNAL inter PATH = %s\n", state->activity->internalDataPath);  
//FHZ_PRINTF("EXTERNAL inter PATH = %s\n", state->activity->externalDataPath);
</code>

код c ++ для его эквивалента android.os.Environment.getFilesDir () и android.os.Environment.getExternalStorageState () и т. д.

<code>            // getPath() - java
        JNIEnv *jni_env = Core::HAZEOS::GetJNIEnv();
        jclass cls_Env = jni_env->FindClass("android/app/NativeActivity");
        jmethodID mid_getExtStorage = jni_env->GetMethodID(cls_Env, "getFilesDir","()Ljava/io/File;");
        jobject obj_File = jni_env->CallObjectMethod( gstate->activity->clazz, mid_getExtStorage);
        jclass cls_File = jni_env->FindClass("java/io/File");
        jmethodID mid_getPath = jni_env->GetMethodID(cls_File, "getPath","()Ljava/lang/String;");
        jstring obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
        const char* path = jni_env->GetStringUTFChars(obj_Path, NULL);
        FHZ_PRINTF("INTERNAL PATH = %s\n", path);
        jni_env->ReleaseStringUTFChars(obj_Path, path);

        // getCacheDir() - java
        mid_getExtStorage = jni_env->GetMethodID( cls_Env,"getCacheDir", "()Ljava/io/File;");
        obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getExtStorage, NULL);
        cls_File = jni_env->FindClass("java/io/File");
        mid_getPath = jni_env->GetMethodID(cls_File, "getAbsolutePath", "()Ljava/lang/String;");
        obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
        path = jni_env->GetStringUTFChars(obj_Path, NULL);
        FHZ_PRINTF("CACHE DIR = %s\n", path); 
        jni_env->ReleaseStringUTFChars(obj_Path, path);

        // getExternalFilesDir() - java
        mid_getExtStorage = jni_env->GetMethodID( cls_Env,"getExternalFilesDir", "(Ljava/lang/String;)Ljava/io/File;");
        obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getExtStorage, NULL);
        cls_File = jni_env->FindClass("java/io/File");
        mid_getPath = jni_env->GetMethodID(cls_File, "getPath", "()Ljava/lang/String;");
        obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
        path = jni_env->GetStringUTFChars(obj_Path, NULL);
        FHZ_PRINTF("EXTERNAL PATH = %s\n", path);
        jni_env->ReleaseStringUTFChars(obj_Path, path);

        //getPackageCodePath() - java
        mid_getPath = jni_env->GetMethodID(cls_Env, "getPackageCodePath", "()Ljava/lang/String;"); 
        obj_File = jni_env->CallObjectMethod(gstate->activity->clazz, mid_getPath); 
        obj_Path = (jstring) jni_env->CallObjectMethod(obj_File, mid_getPath);
        path = jni_env->GetStringUTFChars(obj_Path, NULL);
        FHZ_PRINTF("Looked up package code path = %s\n", path);
</code>

который работает довольно хорошо и приводит к

ВНУТРЕННИЙ ПУТЬ = /data/data/com.fantasyhaze.rememory/files

CACHE DIR = /data/data/com.fantasyhaze.rememory/cache

ВНЕШНИЙ ПУТЬ = /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files

Посмотрел путь к коду пакета = /mnt/asec/com.fantasyhaze.rememory-2/pkg.apk

Но нет файлов из папок ресурсов ...

и мне нужно получить доступ к папке как обычный рабочий каталог для чтения файлов. что было бы возможно в

/mnt/sdcard/Android/data/com.fantasyhaze.rememory/files/Data

Но перемещение всех данных из папки ресурсов (где бы они ни находились) через диспетчер активов в эту папку приводит к удвоенному потреблению памяти.

assets & gt; 1GB означают активы & gt; 2GB, что не имеет смысла. Более того, папка assert, кажется, не работает рекурсивно, а только для небольших файлов данных. что невозможно при использовании больших pak-файлов. Может быть, файлы могут быть доступны непосредственно из АПК при использовании распакуйте систему, а затем распакуйте мои файлы ресурсов, но в любом случае я должен открыть путь apk.

Итак, мои вопросы:

Where is the Assets folder in the apk on the file system? What would be the code (c++) to retrieve the apk location or the location of the executable Can I access it directly with a normal file open method or only if I unpack it. If I can use it without unpacking, how? What would be the code (c++) to retrieve the information if the sd card is mounted?

Я надеюсь, что кто-то может помочь мне :)

Edit: Добавлен каталог кеша и код каталога пакета (и его выходные пути), чтобы обеспечить источник для всех остальных, кто в этом нуждается.

Ответы на вопрос(2)

Ваш ответ на вопрос