Android Ndk: 如何从native层直接获取 assets文件夹下的文件

来源:互联网 发布:蜜蜡优化是什么意思 编辑:程序博客网 时间:2024/06/01 22:47
这篇博文写的特别好 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层写相关读取,代码的语句:
 相关 语句如下:
//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下面的  文件进行读取 操作了。
   
     
  
   


0 0
原创粉丝点击