Android Studio Jni开发(三)Native方法动态注册

本文介绍了Android Studio中JNI函数的动态注册,不遵循头文件声明,而是使用其他函数进行注册。通过创建jniTest02工程,添加Myjni类,并详细讲解了新建Jni目录、创建C++头文件和源文件、.mk文件的过程,以及如何添加NdkBuild支持以编译调试APK。

今天来实现一个Jni函数的动态注册,什么是动态注册呢,我理解为其实就是把函数重新导出,在本例中并没有实现头文件声明的函数,而是用了另一个函数去注册了声明的函数,可能理解这段话有点绕口,那么下面直接开始实践吧,看代码相信更容易理解,如果没有基础也没有学习前两篇博文的话,建议点击此处Jni开发 先学习一下前两篇


一.新建一个名为jniTest02的工程并添加Myjni类


1.Myjni.java代码如下



2.MainActivity.java代码如下



二.新建Jni目录创建C++头文件和源文件与.mk文件


1.生成Myjni.java的头文件放入Jni目录下,方法在前两篇文章有写到

2.创建名为Myjni.cpp的C++源文件

3.创建android.mk文件

4.创建Application.mk文件


android.mk代码如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_CPP_EXTENSION := cpp
LOCAL_MODULE    := Myjni
LOCAL_SRC_FILES := Myjni.cpp
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

Application.mk文件代码如下:

APP_ABI := all
APP_STL := stlport_static
APP_OPIM := debug


Myjni.cpp文件代码如下:

#include <com_example_file_jnitest02_Myjni.h>
#include <android/log.h>

#define  LOG_TAG    "native-dev"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

JNIEXPORT jstring JNICALL Java_com_example_file_jnitest02_Myjni_getString01
  (JNIEnv* env, jclass jc)
{
    return env->NewStringUTF("NativeString01");
}
static JNINativeMethod g_Methods[] = {
        "getString",
        "()Ljava/lang/String;",
        (void*) Java_com_example_file_jnitest02_Myjni_getString01
};
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pJvm, void* pReserved) {
    LOGI("---JNI_OnLoad---", "entry");
    JNIEnv *pEnv = NULL;
    //获取环境
    jint ret = pJvm->GetEnv((void**) &pEnv, JNI_VERSION_1_6);
    if (ret != JNI_OK) {
        LOGI("---JNI_OnLoad---", "ERROR:GetEnv");
        return -1;
    }
    jclass cls = pEnv->FindClass("com/example/file/jnitest02/Myjni");
    if (cls == NULL) {
        LOGI("---JNI_OnLoad---", "FindClass Error");
        return -1;
    }
    //动态注册本地方法
    ret = pEnv->RegisterNatives(cls, g_Methods, sizeof(g_Methods) / sizeof(g_Methods[0]));
    if (ret != JNI_OK) {
        LOGI("---JNI_OnLoad---", "RegisterNatives Error");
        return -1;
    }
    //返回java版本
    return JNI_VERSION_1_6;
}


Myjni.cpp代码解读:



三.添加NdkBuild支持



四.现在可以编译APK并进行调试了





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值