使用NDK api调用AssetManager

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值