jni读取assets资源文件
来源:互联网 发布:央行外汇占款数据 编辑:程序博客网 时间:2024/06/05 16:42
assets目录底下的文件会被打包到一个apk文件里,这些资源在安装时他们并没被解压,使用时是直接从apk中读取的。这里介绍下怎么在jni内使用ndk自带api的接口函数读取assets资源文件,和libzip库函数的使用,可以用来读创建修改压缩文档,这里也是以读取apk安装包内的资源文件为例。
在应用程序内使用定义和使用如下
logcat测试结果
上面例子使用android.mk如下
log.txt内容如下
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 : 定义:public native 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 ; } /*获取文件大小*/ off_t bufferSize = AAsset_getLength(asset); LOGI("file size : %d\n",bufferSize); char *buffer=(char *)malloc(bufferSize+1); buffer[bufferSize]=0; int numBytesRead = AAsset_read(asset, buffer, bufferSize); LOGI(": %s",buffer); free(buffer); /*关闭文件*/ AAsset_close(asset);}
在应用程序内使用定义和使用如下
public native void readFromAssets(AssetManager ass,String filename);readFromAssets(getAssets(),"log.txt");
logcat测试结果
12-15 15:27:33.290: INFO/ReadAssets(3570): ReadAssets12-15 15:27:33.290: INFO/ReadAssets(3570): file size : 13812-15 15:27:33.290: INFO/ReadAssets(3570): : 。。。。。。。。。。。。。。。。12-15 15:27:33.290: INFO/ReadAssets(3570): 这个例子从jni读取assets内文件12-15 15:27:33.290: INFO/ReadAssets(3570): 。。。。。。。。。。。。。。。。
2 使用libzip库读apk包
libzip 使用 C 库来 读创建修改压缩文档,关于libzip在andorid的移植可以参考老外做的android-ndk-assets.zip这个工程,已在NDK下可以编译了,修改下编译生成libzip.so,利用libzip.so和zip.h建立工程,使用libzip还可以读取apk包内其他压缩文件如AndroidManifest.xml布局xml等。void Java_com_fontlose_ReadAssets_readFromAssetsLibzip(JNIEnv* env,jclass tis,jstring assetpath,jstring filename){ LOGI("ReadAssets"); int i=0; jboolean iscopy; const char *mpath = (*env)->GetStringUTFChars(env, assetpath, &iscopy); struct zip* apkArchive=zip_open(mpath, 0, NULL);; (*env)->ReleaseStringUTFChars(env, filename, mpath); struct zip_stat fstat; zip_stat_init(&fstat); int numFiles = zip_get_num_files(apkArchive); LOGI("File numFiles %i \n",numFiles); for (i=0; i<numFiles; i++) { const char* name = zip_get_name(apkArchive, i, 0); if (name == NULL) { LOGE("Error reading zip file name at index %i : %s", zip_strerror(apkArchive)); return; } zip_stat(apkArchive,name,0,&fstat); LOGI("File %i:%s Size1: %d Size2: %d", i,fstat.name,fstat.size ,fstat.comp_size) ; } const char *fname = (*env)->GetStringUTFChars(env, filename, &iscopy); struct zip_file* file = zip_fopen(apkArchive, fname, 0); if (!file) { LOGE("Error opening %s from APK", fname); return; } zip_stat(apkArchive,fname,0,&fstat); (*env)->ReleaseStringUTFChars(env, filename, fname); char *buffer=(char *)malloc(fstat.size+1); buffer[fstat.size]=0; int numBytesRead = zip_fread(file, buffer,fstat.size);; LOGI(": %s\n",buffer); free(buffer); zip_fclose(file); zip_close(apkArchive);}
public native void readFromAssetsLibzip(String apkpath,String filename); readFromAssetsLibzip(getPackageResourcePath(),"assets/log.txt");
logcat测试结果
12-15 15:28:03.430: INFO/ReadAssets(3570): ReadAssets12-15 15:28:03.440: INFO/ReadAssets(3570): File numFiles 1412-15 15:28:03.440: INFO/ReadAssets(3570): File 0:assets/log 2.txt Size1: 138 Size2: 5512-15 15:28:03.440: INFO/ReadAssets(3570): File 1:assets/log.txt Size1: 138 Size2: 5512-15 15:28:03.440: INFO/ReadAssets(3570): File 2:res/layout/main.xml Size1: 956 Size2: 33712-15 15:28:03.440: INFO/ReadAssets(3570): File 3:AndroidManifest.xml Size1: 1348 Size2: 53112-15 15:28:03.440: INFO/ReadAssets(3570): File 4:resources.arsc Size1: 1480 Size2: 148012-15 15:28:03.440: INFO/ReadAssets(3570): File 5:res/drawable-hdpi/icon.png Size1: 3966 Size2: 396612-15 15:28:03.440: INFO/ReadAssets(3570): File 6:res/drawable-ldpi/icon.png Size1: 1537 Size2: 153712-15 15:28:03.440: INFO/ReadAssets(3570): File 7:res/drawable-mdpi/icon.png Size1: 2200 Size2: 220012-15 15:28:03.440: INFO/ReadAssets(3570): File 8:classes.dex Size1: 3468 Size2: 168012-15 15:28:03.440: INFO/ReadAssets(3570): File 9:lib/armeabi/libzip.so Size1: 217246 Size2: 4614012-15 15:28:03.440: INFO/ReadAssets(3570): File 10:lib/armeabi/libreadres.so Size1: 3820 Size2: 177912-15 15:28:03.440: INFO/ReadAssets(3570): File 11:META-INF/MANIFEST.MF Size1: 852 Size2: 44312-15 15:28:03.440: INFO/ReadAssets(3570): File 12:META-INF/CERT.SF Size1: 905 Size2: 48712-15 15:28:03.440: INFO/ReadAssets(3570): File 13:META-INF/CERT.RSA Size1: 776 Size2: 60612-15 15:28:03.440: INFO/ReadAssets(3570): : 。。。。。。。。。。。。。。。。12-15 15:28:03.440: INFO/ReadAssets(3570): 这个例子从jni读取assets内文件12-15 15:28:03.440: INFO/ReadAssets(3570): 。。。。。。。。。。。。。。。。
上面例子使用android.mk如下
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := readresLOCAL_SRC_FILES := readres.cLOCAL_C_INCLUDES+= /opt/android-ndk-r5/platforms/android-9/arch-arm/usr/includeLOCAL_LDLIBS += -L/opt/android-ndk-r5/platforms/android-9/arch-arm/usr/lib/ -llogLOCAL_LDLIBS += -landroidLOCAL_LDLIBS += -lzLOCAL_LDLIBS += -L$(LOCAL_PATH) -lzipinclude $(BUILD_SHARED_LIBRARY)
log.txt内容如下
。。。。。。。。。。。。。。。。这个例子从jni读取assets内文件。。。。。。。。。。。。。。。。
- jni读取assets资源文件
- android开发--- jni读取assets资源文件
- android常见问题之jni读取assets资源文件(附源码)
- android常见问题之jni读取assets资源文件
- android jni 读写资源文件(assets)
- android jni 读写资源文件:assets
- android JNI层读取assets目录文件
- Android 的assets文件资源与raw文件资源读取
- Android:读取assets资源
- Android assets资源读取
- 如果读取资源文件assets 中的db文件
- android原始资源raw和assets文件读取
- 读取assets目录下的资源文件写入到本地
- 如何读取assets目录下存放的原生资源文件
- android 读取assets文件夹下的文件资源
- Android apk安装过程及Java、JNI读取安装包内assets资源文件的两种方法(附源码实例)
- Android apk安装过程及Java、JNI读取安装包内assets资源文件的两种方法(附源码实例)
- assets资源文件配置
- Handler介绍
- UIPageControl的一个Demo
- 导出数据库中的所有表的结构
- 好久不写文字,此次只为感慨
- [Ext.Net]客户关系管理系统
- jni读取assets资源文件
- Unity3D 自己碰到的问题汇总
- 如何跳出iframe(针对登录用户的session验证)
- hdu2492(树状数组+离线处理)
- Poj 3286 How many 0's? + Bzoj 1833 count 数字计数(数位统计)
- Cocos2d-html5 之 HelloWorld 深入分析与调试
- sort函数介绍
- chromium源码剖析之chrome进程通信的基本模式
- HDFS扩容方法