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

被折叠的 条评论
为什么被折叠?



