2012-04-15 16 views
11

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:

  1. ¿Dónde está la carpeta Activos en el apk del sistema de archivos?
  2. Cuál sería el código (C++) para recuperar la ubicación del archivo ejecutable o la ubicación del archivo ejecutable
  3. ¿Puedo acceder directamente con un método abierto de archivo normal o solo si lo descomprimo? Si puedo usarlo sin desempacar, ¿cómo?
  4. ¿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.

+0

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

+0

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 –

+0

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

Respuesta

3

Estoy publicando una respuesta en lugar de marcar esto como un duplicado porque técnicamente, usted está pidiendo más detalles de los que se proporcionan en la pregunta/respuesta que voy a vincular aquí. Entonces, para responder el primero de sus 4 puntos, vea Obtaining the name of an Android APK using C++ and the NativeActivity class.

En cuanto a verificar si la tarjeta SD está montada, debería ser bastante simple. Simplemente intente abrir el directorio o un archivo en la tarjeta SD (que usted sabe que debería estar allí) y, si falla, sabrá que la tarjeta SD no está disponible. Ver What's the best way to check if a file exists in C? (cross platform).

+0

Thx para obtener la información, ¡buscó tanto tiempo pero no pudo encontrar esta publicación en el enlace 2! Con la información allí finalmente pude recuperar la ubicación de la aplicación :) Agregué el código en la primera publicación para proporcionarlo en una forma diferente a la del enlace. La comprobación de archivos está bien, pero pensé que podría haber algún método para comprobar si la tarjeta SD está montada en un código c similar a: 'android.os.Environment.getExternalStorageState(). Equals (android.os.Environment.MEDIA_MOUNTED) ; 'como se ve en [link] (http://stackoverflow.com/questions/902089/how-to-tell-if-the-sdcard-is-mounted-in-android) – odbb

2

Es posible que desee echar un vistazo a "Archivos de expansión", vea APK Expansion Files.

Hasta donde entiendo esto, esto le proporciona un sistema que coloca automáticamente los archivos de recursos (su archivo de expansión) en la "ubicación de almacenamiento compartido".

Así que creo que esto resolvería su problema de datos duplicados.

También hay una breve introducción post on the android-developers blog.

+0

No sabía que hay un limitación de 50MBs !!! en el tamaño del archivo apk? Eso es horrible y esos archivos de expansión podrían resolver el problema, pero de nuevo ¿hay alguna fuente para usar AStorageManager en C/C++ para obtener acceso a los archivos odb? Parece ser mucho trabajo reimplementar las cosas de descarga en c nativo: / – odbb

Cuestiones relacionadas