10

我需要从android中的asset文件夹中读取文本文件,通过互联网搜索我发现从android 2.3开始就有asset_manager api。因为我只针对平板设备,所以这很有用。但由于我不是 C 语言专家,我无法找到任何关于如何使用文件描述符读取/写入文件的示例。我发现了很多使用 FILE* (文件指针)的例子

我的目标是从资产文件夹中解密一个 js 文件,该文件使用 C 加密(用于保护代码),因为如果最终用户反编译了我的 apk,js 代码是可见的。因为资产文件夹在 zip 文件中,所以可以这样做吗?

4

3 回答 3

35

这是我使用asset_manager ndk lib从android assets文件夹中读取文件的代码

    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>
于 2012-05-03T09:03:09.627 回答
2

实际上 FILE* 和 'int' 描述符是等价的, fread/fwrite/fopen/fclose 是 open/close/read/write 函数的对应物(但是这些函数等价,后者是非阻塞的)。

要从 'FILE*' 中获取 'int',您可以使用

int fileno(FILE* f);

在标题中并做相反的事情,你可以使用 fdopen()

FILE *fdopen(int fd, const char *mode);

因此,要么使用 FILE* 将所有内容替换为 int,要么只取其中一个样本并在文件读取之前插入此转换代码。

于 2012-05-02T07:07:31.580 回答
2

它与常规的 fread/fseek 函数非常相似。这是读取函数声明:

ssize_t read(int fd, void *buf, size_t count);

fd它从文件描述符读取到buf缓冲区count字节。如果您考虑 fread,则不要:

fread(buf, count, size, file);

你会打电话给:

read(fd, buf, count*size);

就是这样。就是这么简单。

求也类似。只需查找函数声明并阅读参数名称/描述。这将是显而易见的。

于 2012-05-02T07:12:48.870 回答