Android(安卓)Ndk: 如何从native层直接获取 assets文件夹下的文件
16lz
2021-01-25
这篇博文写的特别好 http://androgeek.info/?p=275
从Native层 直接读取 Android 工程目录 下 Asserts目录下的文件
具体思路如下:Android工程 会被打包成一个 apk文件,具体存储在 data/app下
apk文件是一种 类似于 zip的压缩文件,因此,我们需要 用unzip的开源库,调用该库的 api来 读取 apk文件,将apk解压,从而找到 Asserts目录。
具体做法如下: 首先,下载unzip开源库: http://pan.baidu.com/s/1mg8MfZq 其次,建立jni工程, 默认已经会了 再次,将下载下的unzip文件拷贝到jni目录下: Android.mk 添加如下语句: 1 LOCAL_STATIC_LIBRARIES : = libzip 2 LOCAL_LDLIBS += -lz 3 include $(call all-makefiles-under, $(LOCAL_PATH)) 第一句表示 下载下来的 libzip(unzip开源库)文件夹 下的 源文件 最终会根据 其 Android.mk规定语句编译成 一个 静态库,将这个静态库添加进来 第二句 表示添加 系统的 压缩库, 涉及到文件压缩,图片压缩 一般都会添加它 第三句 表示执行完当前目录 源文件编译后,会继续跟进该目录下的子目录,编译。
最后, 在jni层写相关读取,代码的语句: 相关 语句如下:
注意 : 以上 zip_open读取的path ,是从 java层传下来的 apk安装在android机上的路径名,有了这个路径名我们才能解压
applicationInfo.sourceDir 即为 apk的安装路径
读取的结果如下: 之后 就能继续 对 assets下面的 文件进行读取 操作了。
从Native层 直接读取 Android 工程目录 下 Asserts目录下的文件
具体思路如下:Android工程 会被打包成一个 apk文件,具体存储在 data/app下
apk文件是一种 类似于 zip的压缩文件,因此,我们需要 用unzip的开源库,调用该库的 api来 读取 apk文件,将apk解压,从而找到 Asserts目录。
具体做法如下: 首先,下载unzip开源库: http://pan.baidu.com/s/1mg8MfZq 其次,建立jni工程, 默认已经会了 再次,将下载下的unzip文件拷贝到jni目录下: Android.mk 添加如下语句: 1 LOCAL_STATIC_LIBRARIES : = libzip 2 LOCAL_LDLIBS += -lz 3 include $(call all-makefiles-under, $(LOCAL_PATH)) 第一句表示 下载下来的 libzip(unzip开源库)文件夹 下的 源文件 最终会根据 其 Android.mk规定语句编译成 一个 静态库,将这个静态库添加进来 第二句 表示添加 系统的 压缩库, 涉及到文件压缩,图片压缩 一般都会添加它 第三句 表示执行完当前目录 源文件编译后,会继续跟进该目录下的子目录,编译。
最后, 在jni层写相关读取,代码的语句: 相关 语句如下:
//Read APK Path and unzip the apk zip *ApkArchive = zip_open(path, 0, NULL); if (ApkArchive == NULL) { return ; } //Just for debug, print APK contents int numFiles = zip_get_num_files(ApkArchive); LOG_INFO( "ParseText" , " num to parse: %d" , numFiles); for (int i = 0; i< numFiles; i++) { const char *name = zip_get_name(ApkArchive, i, 0); LOG_INFO("ParseText", "string is assigned by char*");*/ if (name == NULL) { return ; } LOG_INFO( "ParseText" , "File: %i: %s\n" , i, name); }
注意 : 以上 zip_open读取的path ,是从 java层传下来的 apk安装在android机上的路径名,有了这个路径名我们才能解压
final ApplicationInfo applicationInfo = this.getApplicationInfo();start(applicationInfo.sourceDir);
applicationInfo.sourceDir 即为 apk的安装路径
读取的结果如下: 之后 就能继续 对 assets下面的 文件进行读取 操作了。
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- lame音频压缩解码(二)之编译事例Demo
- Android(安卓)NDK开发入门实例
- ELF文件查看利器之readelf用法
- Android(安卓)Studio的(gradle sync failed 问题)
- 第二篇:实现uni-app和原生(Android)以及H5项目混编