Acessar Android APK Dados de ativos diretamente em c ++ sem Asset Manager e copiando

Estou usando puro C ++ no meu motor para criar um motor de jogo no android. Não há um único arquivo java. Basicamente é um jogo que só deve ser armazenado na memória externa. Quando eu movo meus dados de ativos manualmente via adb para meu cartão SD externo, o jogo já funciona bem e estável.

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

Esta não é uma boa solução porque não pode ser entregue. Portanto, eu tenho meus dados de ativos na pasta Ativos que são movidos para o arquivo apk durante o processo de construção com a seguinte estrutura:

Ativos / Dados / Mais Pastas / Com Subpastas Ativos / Dados / EngineData.zip Ativos / Dados / ScriptData.zip

Mas eu não sei onde esses arquivos estão nos sistemas de arquivos para acessá-los no código c ++.

Então eu tentei pegar o caminho para os diretórios de arquivos. E por causa de um bug no estado de atividade nativa eu ​​tenho que recuperar as informações no 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 o seu equivalente a android.os.Environment.getFilesDir () e 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 muito bem e resulta em

CAMINHO INTERNO = /data/data/com.fantasyhaze.rememory/files

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

PATH EXTERNO = /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files

Pesquisou o caminho do código do pacote = /mnt/asec/com.fantasyhaze.rememory-2/pkg.apk

Mas não há arquivos das pastas de recursos ...

e eu preciso acessar uma pasta como diretório de trabalho normal para ler os arquivos. o que seria possível em

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

Mas mover todos os dados da pasta de ativos (onde quer que esteja) por meio do gerenciador de ativos para essa pasta causa um consumo duplicado de memória.

ativos> 1 GB significariam ativos> 2 GB, o que não faz sentido. Mais do que isso, a pasta assert parece não funcionar de forma negativa e apenas para arquivos de dados pequenos, o que não é possível quando se usa arquivos pak maiores. Talvez os arquivos possam ser acessados ​​diretamente do apk quando usar o sistema de descompactação e, em seguida, descompacte meus arquivos de recursos, mas, portanto, tenho que optar pelo caminho do apk de qualquer maneira.

Então minhas perguntas:

Onde está a pasta Ativos no apk no sistema de arquivos?Qual seria o código (c + +) para recuperar o local apk ou a localização do executávelPosso acessá-lo diretamente com um método de abertura de arquivo normal ou somente se eu descompactar o arquivo. Se eu posso usá-lo sem descompactar, como?Qual seria o código (c ++) para recuperar as informações se o cartão SD estiver montado?

Espero que alguém possa me ajudar :)

Editar: Adicionado diretório de cache e o código do diretório do pacote (e seus caminhos de saída), para fornecer a origem para todos que precisam dele.

questionAnswers(2)

yourAnswerToTheQuestion