介绍
接着上一篇博文本次主要介绍JNI的动态注册,以及在JNI中如何开线程。JNI的基础部分,请详细参考JNI的基本使用一
动态注册
与静态注册相比,有如下优缺点:
优点:
1. native中函数名简洁, 方便记忆
2. 需要使用时,需要在 JNI_OnLoad() 进行注册
缺点:
1. native方法需要手动进行注册
工程中使用
对上一篇博文的工程进行改造,将静态注册改成动态注册。在JNI_OnLoad中采用 RegisterNatives 对JNI函数进行注册。
JNINativeMethod 说明
JNINativeMethod 动态注册使用的结构体,描述了函数的参数和返回值 。
typedef struct {
char *name;
char *signature;
void *fnPtr;
} JNINativeMethod;
第一个变量name是Java中函数的名字。
第二个变量signature,用字符串是描述了函数的参数和返回值。
第三个变量fnPtr是函数指针,指向C函数。
动态注册步骤
1. 将java中的native函数名和jni中的实现通过进行一一绑定,填充JNINativeMethod结构体
2. 通过env->RegisterNatives进行注册
3. 在JNI_OnLoad中调用注册函数
代码如下:
填充JNINativeMethod结构体
//java文件路径
static const char *classPathName = "com/stx/jni/JNITest";
static JNINativeMethod methods[] = {
{ "javaCallNative", "()V", (void *)(javaCallNative) },
{ "javaCallNative1", "(I)V", (void *)(javaCallNative1) },
{ "javaCallNative2", "(J)V", (void *)(javaCallNative2) },
{ "javaCallNative3", "(F)V", (void *)(javaCallNative3) },
{ "javaCallNative4", "([B)V", (void *)(javaCallNative4) },
{ "javaCallNative5", "(Ljava/lang/String;)V", (void *)(javaCallNative5) },
{ "nativeCallJavaTest", "()V", (void *)(nativeCallJavaTest) }
};
实现注册函数
int registerNativeMethods(JNIEnv* env,