Necesito leer el archivo de texto de la carpeta de activos en Android, al buscar en Internet encontré que hay una API de asset_manager disponible desde Android 2.3 en adelante. Como estoy apuntando solo a dispositivos de tableta, esto es útil. Pero como no soy experto en lenguaje C, no puedo encontrar ningún ejemplo sobre cómo leer/escribir archivos usando el descriptor de archivos. Encontré muchos ejemplos usando FILE* (punteros de archivo)
Mi objetivo es descifrar un archivo js de la carpeta de activos que está encriptado usando C (para asegurar el código), ya que el código js es visible si el usuario final descompiló mi apk. Debido a que la carpeta de activos está dentro del archivo zip, ¿es posible hacerlo?

Sandeep Manne
Aquí está el código que usé para leer el archivo de la carpeta de activos de Android usando asset_manager ndk lib
AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
AAsset* asset = AAssetManager_open(mgr, (const char *) js, AASSET_MODE_UNKNOWN);
if (NULL == asset) {
__android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, "_ASSET_NOT_FOUND_");
return JNI_FALSE;
}
long size = AAsset_getLength(asset);
char* buffer = (char*) malloc (sizeof(char)*size);
AAsset_read (asset,buffer,size);
__android_log_print(ANDROID_LOG_ERROR, NF_LOG_TAG, buffer);
AAsset_close(asset);
Se agregó la siguiente línea a mi Android.mk
# for native asset manager
LOCAL_LDLIBS += -landroid
Y no olvide incluir en el archivo fuente
#include <android/asset_manager.h>
Prácticamente los descriptores FILE* e ‘int’ son equivalentes y fread/fwrite/fopen/fclose son las contrapartes de las funciones abrir/cerrar/leer/escribir (las funciones son no equivalente sin embargo, estos últimos no son bloqueantes).
Para obtener ‘int’ de ‘ARCHIVO*’ puede usar
int fileno(FILE* f);
en el encabezado y para hacer lo contrario, puede usar fdopen ()
FILE *fdopen(int fd, const char *mode);
Entonces, reemplace todo usando el ARCHIVO * para int o simplemente tome una de las muestras e inserte este código de conversión antes de la lectura del archivo.
Es bastante similar a las funciones regulares de fread/fseek. Aquí está la declaración de la función de lectura:
ssize_t read(int fd, void *buf, size_t count);
se lee de fd
descriptor de archivo en buf
buffer count
bytes Si piensas en fread, entonces en lugar de:
fread(buf, count, size, file);
llamarás:
read(fd, buf, count*size);
Y eso es. Es tan simple.
Buscar también es similar. Simplemente busque la declaración de la función y lea los nombres/descripciones de los argumentos. Será obvio.