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

И что это. Это так просто.

Поиск тоже схож. Просто найдите объявление функции и прочитайте имя/описание аргумента. Это будет очевидно.