Android NDK下读取数据文件的方法

本文介绍了在Android NDK环境下,通过两种方式读取数据文件:1) 使用AAssetManager读取assert目录下的文件;2) 直接fopen读取libs/armeabi目录下的文件。此外,还提到了在NDK编译时如何防止删除so文件,并讨论了读取/sdcard路径的局限性。
摘要由CSDN通过智能技术生成

方法1:数据文件放在assert目录,java层获得assert句柄,传给NDK,NDK用AAssetManager、AAsset_read去读文件。比较晦涩。

方法2:数据文件放在libs/armeabi目录下,安装之后,这个文件在 /data/data/<package>/lib 目录下,可以直接用fopen读取


另外,NDK可以读取/sdcard路径的文件,但是这不适用于读取apk文件中的数据文件。另外, 要use the Java getExternalStorageDirectory() call to get the real path to the sdcard since newer devices don't simply map it to "/sdcard"。这个方法也不可取。


方法2最简单直接,但是在NDK编译时(ndk-build)会自动删除libs/armeabi目录下的so文件,所以你还需要:

1. 在运行ndk-build后,每次都将so文件们重新拷贝到libs/armeabi目录;

2. 在Eclipse中,build project时,不要编译ndk层。见 这里,不要建立里面的Builder即可。


方法1: http://blog.csdn.net/happyhell/article/details/7414110

android常见问题之jni读取assets资源文件

assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取的。这里介绍下怎么在jni内使用 ndk自带api的接口函数读取assets资源文件,和libzip库函数的使用,可以用来读创建修改压缩文档,这里也是以读取apk安装包内的资源文 件为例。

1 用ndk自带的接口函数读apk包

从2.3开始提供这些接口函数,具体看头文件assert.h android/asset_manager.h android/asset_manager_jni.h,可以参考ndk自带例子中samples/native-audio/ jni/native-audio-jni.c。

 
 
 
  1. /************************************** 
  2. * Function Name  : java_com_fontlose_ReadAssets_readFromAssets 
  3. * Description    : void  readFromAssets(AssetManager ass,String filename); 
  4. * Input          : AssetManager对象 filename资源名 
  5. * Output         : None 
  6. * Return         : None 
  7. ***************************************/  
  8. void  Java_com_fontlose_ReadAssets_readFromAssets(JNIEnv* env,jclass tis
  9. ,jobject assetManager,jstring filename) 
  10.    LOGI("ReadAssets");  
  11.    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
  12.    if(mgr==NULL) 
  13.    { 
  14.       LOGI(" %s","AAssetManager==NULL"); 
  15.       return ; 
  16.    } 
  17.   
  18.     /*获取文件名并打开*/ 
  19.    jboolean iscopy; 
  20.    const char *mfile = (*env)->GetStringUTFChars(env, filename, &iscopy); 
  21.    AAsset* asset = AAssetManager_open(mgr, mfile,AASSET_MODE_UNKNOWN); 
  22.    (*env)->ReleaseStringUTFChars(env, filename, mfile); 
  23.    if(asset==NULL) 
  24.    { 
  25.       LOGI(" %s","asset==NULL"); 
  26.       return ; 
  27.    } 
  28.    /*获取文件大小*/
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值