🔥 Java代码调用JNI 方法 🔥
加载library对应的动态库 ndk1
声明 native 的方法 去调用动态库的内容
声明的 native 方法转换成 JNI 对应的头文件 , 规则如下 :
包名 + 类名 + 函数名
中间用下划线隔开
🔥 创建JNI 对应的函数 🔥
首先在Java类中创建函数
接下来在native-lib.cpp里面 创建函数的对应的 JNI 函数
JNI函数参数含义 :
JNIEnv *env 函数表 , 通过这个参数可以调用JNI中的许多函数
jobject thiz 对应的Java类MainActivity
extern “C” 的作用
是为了方便 C++代码可以按照C 的方式进行编译
🔥 动态库函数注册 🔥
动态库里面注册函数的方式有两种 :
静态注册 、动态注册
静态注册 : Native函数+JNI对应的头文件+两者之间函数名和参数形成互相对 .
静态注册 为了保证 Native函数名、参数名和JNI 对应的头文件函数名、参数名对应上 , 中间会有一个查找的过程 , 这个查找的过程是一个耗时的过程 .
动态注册 : 动态库加载的时候就会将函数动态的注册到系统中 , 这样就会省去每次调用时查找的过程 .
CMakeLists.txt 文件里面配置动态注册的库
创建 jni_dynamic_load.cpp 文件
并在 CMakeLists.txt 里面进行注册 jni_dynamic_load.cpp 文件路径
🔥 创建调用Android Log日志的文件 🔥
创建 base.h 文件
#include <android/log.h>
#include <jni.h>
#ifndef ANDROIDCPPSOLIB_LOGUTIL_H
#define ANDROIDCPPSOLIB_LOGUTIL_H
#define LOG_TAG "LOG_JNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#endif //ANDROIDCPPSOLIB_LOGUTIL_H
将创建的文件配置到 CMakeLists.txt 文件里面
在 jni_dynamic_load.cpp 文件里面导入日志文件依赖
通过JavaVM 获取 JNIEnv * env , 通过JNIEnv 可以调用 JNI 提供的函数
JNI_OK 表示获取 JNIEnv 成功 ,其他情况表示失败
🔥 Native函数在底层的实现 🔥
getMessage(JNIEnv *env,jobject jobj)
创建函数 plus(JNIEnv *env,jobject jobj,int x,int y)
将函数注册到系统中
通过源代码查看注册函数
创建注册函数的方法
定义类名字符串结构
#define JAVA_CLASS “com/cmake/ndk1/JNIDynamicLoad”
创建结构体
注册函数到系统中