jni讀取assets資源文件

      網友投稿 1053 2022-05-30

      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 : 定義: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): ReadAssets 12-15 15:27:33.290: INFO/ReadAssets(3570): file size : 138 12-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包

      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

      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);

      }

      jni讀取assets資源文件

      public native void readFromAssetsLibzip(String apkpath,String filename);

      readFromAssetsLibzip(getPackageResourcePath(),"assets/log.txt");

      12-15 15:28:03.430: INFO/ReadAssets(3570): ReadAssets 12-15 15:28:03.440: INFO/ReadAssets(3570): File numFiles 14 12-15 15:28:03.440: INFO/ReadAssets(3570): File 0:assets/log 2.txt Size1: 138 Size2: 55 12-15 15:28:03.440: INFO/ReadAssets(3570): File 1:assets/log.txt Size1: 138 Size2: 55 12-15 15:28:03.440: INFO/ReadAssets(3570): File 2:res/layout/main.xml Size1: 956 Size2: 337 12-15 15:28:03.440: INFO/ReadAssets(3570): File 3:AndroidManifest.xml Size1: 1348 Size2: 531 12-15 15:28:03.440: INFO/ReadAssets(3570): File 4:resources.arsc Size1: 1480 Size2: 1480 12-15 15:28:03.440: INFO/ReadAssets(3570): File 5:res/drawable-hdpi/icon.png Size1: 3966 Size2: 3966 12-15 15:28:03.440: INFO/ReadAssets(3570): File 6:res/drawable-ldpi/icon.png Size1: 1537 Size2: 1537 12-15 15:28:03.440: INFO/ReadAssets(3570): File 7:res/drawable-mdpi/icon.png Size1: 2200 Size2: 2200 12-15 15:28:03.440: INFO/ReadAssets(3570): File 8:classes.dex Size1: 3468 Size2: 1680 12-15 15:28:03.440: INFO/ReadAssets(3570): File 9:lib/armeabi/libzip.so Size1: 217246 Size2: 46140 12-15 15:28:03.440: INFO/ReadAssets(3570): File 10:lib/armeabi/libreadres.so Size1: 3820 Size2: 1779 12-15 15:28:03.440: INFO/ReadAssets(3570): File 11:META-INF/MANIFEST.MF Size1: 852 Size2: 443 12-15 15:28:03.440: INFO/ReadAssets(3570): File 12:META-INF/CERT.SF Size1: 905 Size2: 487 12-15 15:28:03.440: INFO/ReadAssets(3570): File 13:META-INF/CERT.RSA Size1: 776 Size2: 606 12-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): 。。。。。。。。。。。。。。。。

      LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := readres LOCAL_SRC_FILES := readres.c LOCAL_C_INCLUDES+= /opt/android-ndk-r5/platforms/android-9/arch-arm/usr/include LOCAL_LDLIBS += -L/opt/android-ndk-r5/platforms/android-9/arch-arm/usr/lib/ -llog LOCAL_LDLIBS += -landroid LOCAL_LDLIBS += -lz LOCAL_LDLIBS += -L$(LOCAL_PATH) -lzip include $(BUILD_SHARED_LIBRARY)

      。。。。。。。。。。。。。。。。 這個例子從jni讀取assets內文件 。。。。。。。。。。。。。。。。

      Android

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:為PostgreSQL配置pgAdmin管理模塊
      下一篇:【每天進步一點點】【Atlas 200 DK】基于YOLOv3_Resnet18的行人檢測
      相關文章
      久久综合久久综合亚洲| 亚洲国产成人久久77| 日本亚洲色大成网站www久久| 日韩亚洲Av人人夜夜澡人人爽 | 亚洲av一本岛在线播放| 亚洲国产情侣一区二区三区| 亚洲日韩在线视频| 亚洲国语在线视频手机在线| 亚洲国产成人资源在线软件 | 日批日出水久久亚洲精品tv| 99亚洲乱人伦aⅴ精品| 国产成人精品久久亚洲高清不卡| 亚洲成aⅴ人片久青草影院按摩| 亚洲精品蜜夜内射| 狠狠综合亚洲综合亚洲色| 婷婷亚洲综合一区二区| 亚洲第一区在线观看| 亚洲一区视频在线播放| 亚洲中文字幕在线乱码| 国产成人亚洲综合无码精品| 亚洲国产精品第一区二区| 亚洲高清资源在线观看| 亚洲啪啪免费视频| 亚洲综合偷自成人网第页色| 亚洲色大成WWW亚洲女子| 国产精品亚洲综合天堂夜夜| 亚洲精品成人区在线观看| 亚洲伦乱亚洲h视频| 亚洲欧洲无码AV电影在线观看 | 亚洲欧美日韩中文无线码 | 精品国产亚洲AV麻豆 | 亚洲一区二区三区免费| 亚洲妇熟XXXX妇色黄| 亚洲一卡2卡三卡4卡有限公司| 亚洲精品视频专区| 亚洲精品国产国语| 毛片亚洲AV无码精品国产午夜| 亚洲一级Av无码毛片久久精品| 亚洲精品美女久久久久99| 久久精品国产亚洲av麻豆色欲| 亚洲三级视频在线观看|