Acceda a los datos de Android APK Asset directamente en c ++ sin Asset Manager y copiando

Estoy usando C ++ puro en mi motor para crear un motor de juego en Android. No hay un solo archivo java. Básicamente es un juego que solo debe almacenarse en la memoria externa. Cuando muevo mis datos de activos manualmente a través de adb a mi tarjeta sd externa, el juego funciona bien y estable.

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

Esta no es una buena solución porque no puede ser entregada. Por lo tanto, tengo mis datos de activos en la carpeta de Activos que se mueven al archivo apk durante el proceso de construcción con la siguiente estructura:

Assets / Data / MoreFolders / Withsubfolders Assets / Data / EngineData.zip Assets / Data / ScriptData.zip

Pero no sé dónde están esos archivos en los sistemas de archivos para acceder a ellos en código c ++.

Así que traté de obtener la ruta a los directorios de archivos. Y debido a un error en el estado de actividad nativa, tengo que recuperar la información en código normal.

<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ódigo c ++ para su equivalente a android.os.Environment.getFilesDir () y android.os.Environment.getExternalStorageState () ect

<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>

que funciona bastante bien y da como resultado

RUTA INTERNA = /data/data/com.fantasyhaze.rememory/files

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

RUTA EXTERNA = /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files

Busque la ruta del código del paquete = /mnt/asec/com.fantasyhaze.rememory-2/pkg.apk

Pero no hay archivos de las carpetas de activos ...

y necesito acceder a una carpeta como directorio de trabajo normal para leer los archivos. que sería posible en

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

Pero mover todos los datos de la carpeta de activos (donde sea que esté) a través del administrador de activos a esta carpeta, hace que el consumo de memoria se duplique.

activos> 1GB significaría activos> 2GB que no tiene sentido. Más que eso, la carpeta assert parece no funcionar recusivamente y solo para archivos de datos pequeños que no es posible cuando se usan archivos pak más grandes. Tal vez se pueda acceder directamente a los archivos desde la aplicación al usar el sistema de descompresión y luego uzip mis archivos de recursos, pero, por lo tanto, tengo que abrir la ruta de la aplicación de todos modos.

Así que mis preguntas:

¿Dónde está la carpeta de Activos en la apk en el sistema de archivos?¿Cuál sería el código (c ++) para recuperar la ubicación de apk o la ubicación del ejecutable?¿Puedo acceder a él directamente con un método de apertura de archivo normal o solo si lo descomprimo? Si puedo usarlo sin desempacar, ¿cómo?¿Cuál sería el código (c ++) para recuperar la información si la tarjeta SD está montada?

Espero que alguien pueda ayudarme :)

Editar: Se agregó el directorio de caché y el código del directorio del paquete (y sus rutas de salida), para proporcionar el origen para todos los demás que lo necesiten.

Respuestas a la pregunta(2)

Su respuesta a la pregunta