JNI基本使用二

介绍

      接着上一篇博文本次主要介绍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,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值