Activity代码
/**
*在jni读取asset资源
*/
private void getAssetStringUseJNI(){
String str = AssetUtil.getAssetStringUseJNI(this,"demo.txt");
Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
assert("hellojni".equals(str));
}
static {
System.loadLibrary("MyJNIDemo");
}
工具类代码
public native static String getAssetStringUseJNI(Context context,String path);
NDK代码
#include <jni.h>
#include <assert.h>
#include <string.h>
#include <malloc.h>
#include <android/asset_manager.h>
#include <android/asset_manager_jni.h>
#include <android/log.h>
#include "com_netease_study_task_AssetUtil.h"
/*
* Class: com_netease_study_task_AssetUtil
* Method: getAssetStringUseJNI
* Signature: (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_netease_study_task_AssetUtil_getAssetStringUseJNI
(JNIEnv *env , jclass assetUtilClass, jobject context, jstring filename){
jclass class=(*env)->GetObjectClass(env,context);
jmethodID getAssets=(*env)->GetMethodID(env,class,"getAssets","()Landroid/content/res/AssetManager;");
//创建一个AssetManager对象
AAssetManager *mgr = AAssetManager_fromJava(env, (*env)->CallObjectMethod(env,context,getAssets));
//获取文件名并打开
jboolean iscopy;
const char *filePath = (*env)->GetStringUTFChars(env, filename, &iscopy);
AAsset* asset = AAssetManager_open(mgr, filePath, AASSET_MODE_UNKNOWN);
long size = AAsset_getLength(asset);//获取文件长度
char* buffer = (char*) malloc (sizeof(char)*size+1);
buffer[size]='\0';
AAsset_read(asset,buffer,size);
jstring result=(*env)->NewStringUTF(env,buffer);
free(buffer);
AAsset_close(asset);
return result;
};
Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := src/main/jni/com_netease_study_task_AssetUtil.c
LOCAL_LDLIBS += -llog
LOCAL_LDLIBS += -landroid
LOCAL_MODULE := MyJNIDemo
include $(BUILD_SHARED_LIBRARY)
Local.property文件
ndk.dir=D\:\\sdk\\ndk-bundle
sdk.dir=D\:\\sdk