jni 动态注册

__BEGIN_DECLS
__END_DECLS

define __BEGIN_DECLS extern "C" {

define __END_DECLS }

宏定义
就是添加了 extern "C"
为了使 C 代码和 C++ 代码保持互相兼容

如何添加C/C++ 代码在官网介绍的很详细
https://developer.android.com/studio/projects/add-native-code.html?hl=zh-cn

按照官网教程创建好了C++的model之后 我们顺便创建一个头文件
并且在头文件中声明方法


jni 动态注册_第1张图片
头文件.png

其中 JNI_OnLoad方法会在java中调用System.loadLibrary时调用


jni 动态注册_第2张图片
load_library.png

JNI_OnLoad与JNI_OnUnload在jni.h中声明 但是没有实现 需要自己实现
在方法中做初始化与注册JNI

jni 动态注册_第3张图片
JNI_OnLoad.png

本文使用的是动态注册JNI 。
动态注册JNI 我们需要一个JNINativeMethod 类型的数组
每个元素需要3个数据
第一个为java中的native方法名
第二个就是方法签名
第三个为对应C/C++ 中的方法指针

第一个自己填写
第二个 我们可以使用javap -s -pClass来进行获取方法签名
但是首先我们需要先使用javac 编译成class文件
在调用javap命令来获取方法签名


javap-s.png

注意:使用javap 命令 默认只输出 protected、包级私有、public 修饰的方法,添加-p 即可查看声明为private的方法签名

初始化了JNINativeMethod之后 我们需要在JNI_OnLoad中调用RegisterNatives进行注册。
LENGTH是一个宏定义 用来计算数组长度的

具体方法实现
#define LENGTH(x) ((int) (sizeof(x) / sizeof((x)[0])))

jni 动态注册_第4张图片
method.png

如果是 静态方法的话 ,第二个参数需要添加jclass 参数 表明JNI 实现的是具体哪个类的方法
如果是 示例方法的话 第二个参数需要添加 jobject 参数,表明实现的具体哪个示例的方法

你可能感兴趣的:(jni 动态注册)