我需要从android中的资产文件夹中读取文本文件,通过在互联网上搜索,我发现有从android 2.3开始提供的asset_manager api。由于我只针对平板电脑设备,因此这很有用。但由于我不是C语言专家,我无法找到有关如何使用文件描述符读/写文件的任何示例。我发现很多使用FILE *(文件指针)的例子
我的目标是解密资产文件夹中的js文件,该文件已加密 使用C(用于保护代码),因为如果最终用户可以看到js代码 反编译我的apk。因为资产文件夹在zip文件中是可以的吗?
答案 0 :(得分:33)
这是我用于使用asset_manager ndk lib
从android资源文件夹中读取文件的代码 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
#include <android/asset_manager.h>
答案 1 :(得分:2)
实际上FILE *和'int'描述符是等价的,fread / fwrite / fopen / fclose是打开/关闭/读/写函数的对应物(函数不等效,但是后者是无阻碍的。)
要从'FILE *'获取'int',您可以使用
int fileno(FILE* f);
在标题中并执行反转,您可以使用fdopen()
FILE *fdopen(int fd, const char *mode);
因此要么使用FILE *替换所有内容,要么只取一个样本并在文件读取之前插入此转换代码。
答案 2 :(得分: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);
就是这样。它很简单。
寻求也是类似的。只需查看函数声明并读取参数名称/描述。很明显。