Estoy usando puro C++ 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 un adb a mi tarjeta sd externa, el juego funciona bien y es estable.Acceda a Android APK Datos de activos directamente en C++ sin administrador de activos y copiando
adb push ..\..\Bin\Data /sdcard/Android/data/com.fantasyhaze.%SMALL_PACKAGE_NAME%/files/Data/
Esta no es una buena solución porque no se puede entregar. Por lo tanto tengo mis activos de datos de la carpeta Activos el cual será movida en el archivo apk durante el proceso de la construcción con la siguiente estructura:
Activos/Datos/MoreFolders/Withsubfolders Activos/Datos/EngineData.zip Activos/datos/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.
// 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);
C++ código para su equivalente a android.os.Environment.getFilesDir() y android.os.Environment.getExternalStorageState() ect
// 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);
que funciona bastante bien y los resultados en
camino interno = /data/data/com.fantasyhaze.rememory/files
CACHE DIR = /data/data/com.fantasyhaze.rememory/cache
EXTERNOS path = /mnt/sdcard/Android/data/com.fantasyhaze.rememory/files
alzó la vista ruta de código 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. lo que sería posible en
/mnt/sdcard/Android/data/com.fantasyhaze.rememory/files/Data
Pero mover todos los datos de la carpeta de recursos (donde sea) a través de gestor de activos a esta carpeta , causa el doble consumo de memoria.
activos> 1GB significa activos> 2GB que no tiene sentido. Más que eso, la carpeta assert parece no funcionar de manera recusiva y solo para archivos de datos pequeños que no es posible cuando se usan archivos pak más grandes. Tal vez los archivos se pueden acceder directamente desde la aplicación al usar el sistema de descompresión y luego uzip mis archivos de recursos, pero por lo tanto, tengo que optar por la ruta de apk de todos modos.
así que mi pregunta:
- ¿Dónde está la carpeta Activos en el apk del sistema de archivos?
- Cuál sería el código (C++) para recuperar la ubicación del archivo ejecutable o la ubicación del archivo ejecutable
- ¿Puedo acceder directamente con un método abierto 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 me :)
Editar puede ayudar: directorio de caché Añadido y el código del directorio de paquetes (y es rutas de salida), para proporcionar la fuente de todos los demás que lo necesita.
Obtención de activos desde el lado NDK es complicado y poco confiable debido a un error en ciertas versiones de la implementación nativa de Android. Déjame encontrar ese NFO y contactarte. –
Si no está decidido a utilizar NativeActivity, puede utilizar este método (solo para referencia futura) para encontrar el APK y cargar activos. http://androgeek.info/?p=275 –
Hola, estoy tratando de usar este código en esta pregunta. Necesito obtener la ruta "getPackageCodePath" para el archivo .apk y la ruta del directorio interno. pero sigue arrojándome el error de no poder llamar. alguien puede ayudarme ?? gracias por adelantado. en MainActivity tengo: prueba int nativa pública(); y carga la biblioteca. en el código C estoy llamando al método JNI y la misma "ruta del código del paquete" dada para el error .apk: – RKosamia