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
",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 라이브러리를 사용하여 수정 압축 문서를 읽습니다. andorid에 대한 libzip 이식은 외국인이 하는android-ndk-assets를 참고할 수 있습니다.zip 이 프로젝트는 NDK에서 컴파일할 수 있습니다. 수정하면libzip을 컴파일합니다.so,libzip. 활용so 및 zip.l 프로젝트를 만듭니다.libzip을 사용하면 apk 패키지 안의 다른 압축 파일인 안드로이드 Manifest를 읽을 수 있습니다.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
",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
",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
。。。。。。。。。。。。。。。。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.