Uzyskaj dostęp do danych zasobów APK Androida bezpośrednio w c ++ bez Menedżera zasobów i kopiowania

Używam czystego C ++ w moim silniku, aby stworzyć silnik gry w Androidzie. Nie ma jednego pliku java. Zasadniczo jest to gra, która powinna być przechowywana tylko w pamięci zewnętrznej. Kiedy ręcznie przenoszę dane dotyczące zasobów przez adb na moją zewnętrzną kartę SD, gra działa już dobrze i stabilnie.

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

To nie jest dobre rozwiązanie, ponieważ nie można go dostarczyć. Dlatego mam swoje dane zasobów w folderze Zasoby, który jest przenoszony do pliku apk podczas procesu budowania o następującej strukturze:

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

Ale nie wiem, gdzie są te pliki w systemach plików, aby uzyskać do nich dostęp w kodzie c ++.

Próbowałem więc uzyskać ścieżkę do katalogów plików. Z powodu błędu w rodzimym stanie aktywności muszę pobrać informacje w normalnym kodzie.

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

kod c ++ dla jego odpowiednika dla android.os.Environment.getFilesDir () i 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>

który działa całkiem dobrze i skutkuje

INTERNAL PATH = /data/data/com.fantasyhaze.rememory/files

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

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

Wyszukaj kod pakietu path = /mnt/asec/com.fantasyhaze.rememory-2/pkg.apk

Ale nie ma plików z folderów zasobów ...

i muszę uzyskać dostęp do folderu jako normalnego katalogu roboczego, aby odczytać pliki. co byłoby możliwe w

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

Jednak przeniesienie wszystkich danych z folderu zasobów (gdziekolwiek jest) za pośrednictwem menedżera zasobów do tego folderu powoduje dwukrotne zużycie pamięci.

aktywa> 1 GB oznaczałyby aktywa> 2 GB, co nie ma sensu. Więcej niż to, że wydaje się, że folder assert nie działa recusive i tylko dla małych plików danych, co nie jest możliwe przy użyciu większych plików pak. Być może pliki mogą być dostępne bezpośrednio z apk podczas korzystania z systemu rozpakowywania, a następnie uzip moich plików ressource, ale i tak muszę wybrać ścieżkę apk.

Więc moje pytania:

Gdzie znajduje się folder Zasoby w apk w systemie plików?Jaki byłby kod (c ++) do pobrania lokalizacji apk lub lokalizacji pliku wykonywalnegoCzy mogę uzyskać do niego bezpośredni dostęp za pomocą zwykłej metody otwierania pliku lub tylko wtedy, gdy go rozpakuję. Jeśli mogę go używać bez rozpakowywania, jak?Jaki byłby kod (c ++) do pobierania informacji, jeśli karta SD jest zamontowana?

Mam nadzieję, że ktoś może mi pomóc :)

Edytować: Dodano katalog pamięci podręcznej i kod katalogu pakietów (i jego ścieżki wyjściowe), aby zapewnić źródło wszystkim, którzy tego potrzebują.

questionAnswers(2)

yourAnswerToTheQuestion