方法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
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。
- /**************************************
- * Function Name : java_com_fontlose_ReadAssets_readFromAssets
- * Description : void readFromAssets(AssetManager ass,String filename);
- * Input : AssetManager对象 filename资源名
- * Output : None
- * Return : None
- ***************************************/
- void Java_com_fontlose_ReadAssets_readFromAssets(JNIEnv* env,jclass tis
- ,jobject assetManager,jstring filename)
- {
- LOGI("ReadAssets");
- AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
- if(mgr==NULL)
- {
- LOGI(" %s","AAssetManager==NULL");
- return ;
- }
- /*获取文件名并打开*/
- jboolean iscopy;
- const char *mfile = (*env)->GetStringUTFChars(env, filename, &iscopy);
- AAsset* asset = AAssetManager_open(mgr, mfile,AASSET_MODE_UNKNOWN);
- (*env)->ReleaseStringUTFChars(env, filename, mfile);
- if(asset==NULL)
- {
- LOGI(" %s","asset==NULL");
- return ;
- }
- /*获取文件大小*/