android常見問題之jni讀取assets資原始檔(附原始碼)
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包
libzip 使用 C 庫來 讀建立修改壓縮文件,關於libzip在andorid的移植可以參考老外做的android-ndk-assets.zip這個工程,已在NDK下可以編譯了,修改下編譯生成libzip.so,利用libzip.so和zip.h建立工程,使用libzip還可以讀取apk包內其他壓縮檔案如AndroidManifest.xml佈局xml等。
/******************************************************************************* * Function Name : java_com_fontlose_ReadAssets_readFromAssetsLibzip * Description : 定義:public native void readFromAssetsLibzip(String apkpath,String filename); * Input : apkpath路徑 filename 資源名 * Output : None * Return : None *******************************************************************************/ 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): 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): 。。。。。。。。。。。。。。。。
上面例子使用android.mk如下
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)
log.txt內容如下
。。。。。。。。。。。。。。。。
這個例子從jni讀取assets內檔案
。。。。。。。。。。。。。。。。
jni工程和測試工程原始碼我已上傳到我的資源 有興趣的童鞋可以下來看下
http://d.download.csdn.net/down/3518697/fontlose相關推薦
android常見問題之jni讀取assets資原始檔(附原始碼)
assets目錄底下的檔案會被打包到一個apk檔案裡,這些資源在安裝時他們並沒被解壓,使用時是直接從apk中讀取的。這裡介紹下怎麼在jni內使用ndk自帶api的介面函式讀取assets資原始檔,和libzip庫函式的使用,可以用來讀建立修改壓縮文件,這裡也是以
jni讀取assets資原始檔
assets目錄底下的檔案會被打包到一個apk檔案裡,這些資源在安裝時他們並沒被解壓,使用時是直接從apk中讀取的。這裡介紹下怎麼在jni內使用ndk自帶api的介面函式讀取assets資原始檔,和libzip庫函式的使用,可以用來讀建立修改壓縮文件,這裡也是以讀取apk安
Android學習第二課:Assets資原始檔讀取及AssetManager介紹
APK安裝過程 複製APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex檔案(Dalvik位元組碼)儲存到dalvik-cache目錄,並data/data目錄下建立對應的應用資料目錄,Android系統在sdcard上為每一個應用分配了
Android apk安裝過程及Java、JNI讀取安裝包內assets資原始檔的兩種方法(附原始碼例項)
問題背景:在PC上的程式可以輕鬆使用./或不用指明,預設讀取的就是程式所在路徑內的檔案。但在Android上,應用程式被打包成apk,程式執行時無法直接獲取apk(壓縮包)內的檔案。但在一些特殊場合,如載入影象處理訓練好的分類器、模型等資料,要求每個apk到手機上都能執行,就
android jni 讀寫資原始檔:assets
想在jni下想讀寫打包的資原始檔(assets目錄底下的檔案)並非像讀寫普通檔案一樣(fopen相關函式)。因為所有的程式碼與資源都會被打包到一個apk檔案裡。所以訪問資源就必須對這個包進行讀寫操作。目前據我所知的有兩種方法: 1,用zlib庫讀寫apk包; 2,用
Android自助餐之Jni(六)NDK入門
Android自助餐之Jni(六)NDK入門 Android自助餐之Jni六NDK入門 Android自助餐專欄 Android自助餐之Jni一最簡單的執行 Android自助
c# 讀取.resx資原始檔
新增資原始檔,並命名為innerResource.resx。 程式碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy
2 使用Java讀取外部資原始檔,連線池配置
1 外部資原始檔 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.username=root jdbc.password=123456 jdbc.url=jdbc:mysql://127.0.0.1:3306/ma
NSBundle (常用API+讀取本地資原始檔)
//靜態庫Framework中訪問內部 image、bundle UIImageView *im = [[UIImageView alloc]initWithFrame:CGRectMake(200, 200, 300, 300)]; im.backgro
Android工程依賴:android中打包帶有Activity以及資原始檔的jar包在工程中呼叫
這是因為android的特殊性,android不僅有java檔案還有res檔案,需要研究如何將資源以及activity檔案打包成jar檔案供其他 專案呼叫,最終多方嘗試,找到如下兩種方案。方案二是從android的官方文件中找到的完美解決方案。方案二更優,方案一要求兩個工程包名最好一樣,而 方案二不
Android開發之jni串列埠
前言 我第一次聽說串列埠完全是懵逼狀態,腦子沒一點概念,於是我就到處百度,但是發現網上的例子都是一些亂七八糟的程式碼,有程式碼也基本都不會解釋,現在做這個串列埠開發也有段時間了,現在根據我的理解寫了這篇部落格。 串列埠是什麼? 串列埠就是一個可以將
Spring Boot 讀取靜態資原始檔
一、需求場景有時候我們需要在專案中使用一些靜態資原始檔,比如城市資訊檔案 ueditorConfig.json,在專案啟動後讀取其中的資料並初始化寫進資料庫中。二、實現靜態資原始檔 ueditorCon
Android 載入其他Apk中的資原始檔
public Drawable loadApkResources(String apkPath) {try {//獲取apk的資源 最終都要通過AssetManager 獲取, getAssets()
Android 減少APK大小--壓縮圖片資原始檔
開啟這個網站 https://tinypng.com/ 將demo裡面的圖片資原始檔一個一個放進去,他會自動生成新的壓縮圖片 下載後替換原來的圖片就行了 注意 有些圖片壓縮後,可能效果不是很好,特別是大的圖片,最好多檢查一下 一般 情況還是可以的
Android Studio 檢查並去除無用資原始檔
在android studio中其實也是跟Eclipse一樣,可以使用Lint外掛的。具體方法如下。 在專案中點選右鍵,在出現的右鍵選單中有“Analyze” --> “run inspaction by Name ...”。在彈出的搜尋視窗中輸入想執行的檢查型別,如“Unused Resourc
在瀏覽器外掛中讀取JSON資原始檔 2018-10-10
續前文: 瀏覽器外掛實現GitHub程式碼翻譯原型演示 此改進只為演示: 詞典資料提取到json檔案 · program-in-chinese/[email protected] manifest.json中新增資源路徑: "web_accessible_resou
Spring boot 學習之旅--載入靜態資原始檔
介面寫久了感覺Jquery忘光了,在網上蕩了一個帶頁面的專案,根據要求搭建好spring boot+thymeleaf配置,js 、css放到static資料夾下,啟動專案發現樣式不顯示,查閱資料boot專案是預設載入static下的靜態資源,在頁面'ctr'下也能進去,好鬱
Android 載入圖片 JNI 讀取使用圖片
最近在學習ndk載入紋理的例子時,有些收穫,寫出來與大家共同探討! 在用ndk開發遊戲時,最常見的就是顯示圖片,在c語言下用opengl貼圖,經過實踐,已知有4種方法可行! 備註:以下部分內容參考網上程式碼,具體是哪,忘記了。如有冒犯,敬請諒解! 1.
Android學習之如何讀取本地音樂以及圖片
最近做音樂播放器讀取本地音樂這一塊。簡單模仿網易雲音樂的介面。 首先我建議了一個music類 public class music { private long id; private long album_id; privat
Assets資原始檔的層級目錄的使用案例
最近在做一個本地的漫畫專案,因為沒有到網路,所有的漫畫資源都存在assets下,也正好趁此機會來總結一下Assets檔案的使用,要不大家一起來看看測測,你到底瞭解Assets多少 assets和res/raw資原始檔的區別 1 . res/raw中的檔案會被