Android читает текстовый файл из папки с помощью C (ndk)
Мне нужно прочитать текстовый файл из папки ресурсов в android, выполнив поиск через интернет, я обнаружил, что с android 2.3 и дальше доступен ассемблер asset_manager. Поскольку я нацелен только на устройства с планшетом, это полезно. Но поскольку я не являюсь экспертом в языке C, я не могу найти какой-либо пример того, как читать/писать файлы с помощью дескриптора файла. Я нашел много примеров, используя FILE * (указатели файлов)
Моя цель - дешифровать файл js из папки ресурсов, которая зашифрована используя C (для обеспечения кода), поскольку код js отображается, если конечный пользователь декомпилировал мой apk. Поскольку папка с ресурсами находится внутри zip файла, возможно ли это сделать?
Ответы
Ответ 1
Вот код, который я использовал для чтения файла из папки ресурсов Android, используя 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);
Добавлена следующая строка в мой Android.mk
# for native asset manager
LOCAL_LDLIBS += -landroid
И не забудьте включить в исходный файл
#include <android/asset_manager.h>
Ответ 2
Практически дескрипторы FILE * и 'int' эквивалентны, а fread/fwrite/fopen/fclose являются аналогами функций open/close/read/write (функции не являются эквивалентными, но последние не блокируют).
Чтобы получить 'int' из 'FILE *', вы можете использовать
int fileno(FILE* f);
в заголовке и для выполнения инверсии вы можете использовать fdopen()
FILE *fdopen(int fd, const char *mode);
Итак, замените все, используя FILE *, на int или просто возьмите один из образцов и вставьте этот код преобразования перед чтением файла.
Ответ 3
Он очень похож на обычные функции fread/fseek.
Здесь читайте функцию declaraton:
ssize_t read(int fd, void *buf, size_t count);
Он читает из дескриптора файла fd
в буфер buf
buffer count
bytes. Если вы думаете о fread, то вместо:
fread(buf, count, size, file);
вы вызываете:
read(fd, buf, count*size);
И что это. Это так просто.
Поиск тоже схож. Просто найдите объявление функции и прочитайте имя/описание аргумента. Это будет очевидно.