您的位置:首页 > 移动开发 > Android开发

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

2017-11-11 22:25 483 查看
今天来实现一个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;
}
//返回jav
9759
a版本
return JNI_VERSION_1_6;
}


Myjni.cpp代码解读:



三.添加NdkBuild支持



四.现在可以编译APK并进行调试了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息