【问题标题】:Android read text file from asset folder using C (ndk)Android使用C(ndk)从资产文件夹中读取文本文件
【发布时间】:2012-05-11 15:42:25
【问题描述】:

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

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

【问题讨论】:

    标签: c encryption android-ndk


    【解决方案1】:

    这是我使用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>
    

    【讨论】:

    • 很好的答案!与 Assimp 一起为我工作以加载 3D 模型。首先,如上所述,我将文件加载到内存中,然后将缓冲区传递给 aiImportFileFromMemory
    • 你能帮我弄清楚你在哪里传递文件名吗?
    • @Nishant 你能弄清楚如何传递文件名吗?
    • @re3el 抱歉,我几个月前就开始工作了,无法访问源代码。
    • #include 用于 AAssetManager_fromJava
    【解决方案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,要么只获取其中一个样本,然后在读取文件之前插入此转换代码。

    【讨论】:

    • 好的。这实际上与 NDK 无关,因此如果您在此处发布一些您遇到问题的 C 代码,社区将能够更好地帮助您。祝你编码好运:)
    【解决方案3】:

    它与常规的 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);
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2011-01-17
      相关资源
      最近更新 更多