java 动态加载jni_JNI静态注册与动态注册详解

本文详细介绍了Java JNI的动态注册和静态注册过程,包括创建Java应用、使用Eclipse和Clion生成头文件、实现C/C++代码、编译动态库,以及在Java中加载和调用库函数的步骤。推荐使用动态注册以获得更高的灵活性。
摘要由CSDN通过智能技术生成

JNI注册,是指将java层方法(native关键字修饰的)和C层方法对应起来,以实现java层代码调用c层代码的目的。JNI注册分为静态注册和动态注册两种,静态注册是通过固定格式方法名进行关联,动态注册是通过动态添加映射关系来进行关联,方法名可以随便起,比较灵活,我们推荐使用动态注册。在进行注册前,需要先下载两个工具Clion和eclipse(能写java application就可以),然后我们就可以开始注册了。

静态注册

1.首先,在eclipse新建一个Java Application,名称可以随意,比如叫JavaJni,然后在src目录下新建一个package名为clz,再clz包下新建java类Register.java,类中写一个native方法如下:

9f9c4d58b9935692f9fd477d0dac5adf.png

2.进入命令行,来到Register.java所在目录下,使用命令 javac Register.java生成Register.class文件

3.命令行,回到src目录下,通过命令 javah clz.Register 生成clz_Register.h

4.在Clion中,新建一个C++ Library,Library type选择shared,并将jdk/include下的jni.h文件和jni_md.h文件拷贝过来

5.将第三步中生成的clz_Register.h文件拷贝到Clion中刚刚新建的项目中

6.修改jni.h的引用如下:

64cfe67a7a1eab4963e77154c5cab924.png

新建clz_Register.c文件,引入clz_Register.h,实现.h中对应的函数

751277e3f8850ef863c11be24326ec69.png

在Clion项目中的CMakeLists.txt中添加编译配置

f3a768aa94024644cd050c0d02d2a373.png

第一个参数firstlib,表示编译后生成的动态库名称

第二个参数可以选择STATIC或者SHARED,分别表示是静态库还是动态库,一般我们使用动态库

第三个及后面的参数,表示需要编译入库的文件

9.在Clion中选择Build-BuildProject,可以在cmake-build-debug下生成libfirstlib.dylib(mac为dylib,windows为dll)

10.将第8步生成的libfirstlib.dylib拷贝到eclipse项目的libs目录下(没有可新建)

11.在Register.java中加载库,并且调用库中函数

b6b7756c3951cd76f00facaace1967d8.png

动态注册

首先,在eclipse新建一个Java Application,名称可以随意,比如叫JavaJni,然后在src目录下新建一个package名为register,在register包下新建java类DynamicRegister.java,类中写native方法如下:

daad2cc51d0ad0c490fd3b5eedf5498b.png

在Clion中,新建一个C++ Library,Library type选择shared,并将jdk/include下的jni.h文件和jni_md.h文件拷贝过来

新建DynamicRegister.c文件,引入jni.h和实现两个方法,如下

6d12fa62473ead926ff26bb6c9c6a95f.png

添加动态注册

0a6f98822ac93dee31e49ee804be3156.png

在Clion项目中的CMakeLists.txt中添加编译配置

cfd1131ca8df35302b1ba17b0caec386.png

第一个参数firstlib,表示编译后生成的动态库名称

第二个参数可以选择STATIC或者SHARED,分别表示是静态库还是动态库,一般我们使用动态库

第三个及后面的参数,表示需要编译入库的文件

6.在Clion中选择Build-BuildProject,可以在cmake-build-debug下生成libfirstdylib.dylib(mac为dylib,windows为dll)

7.将第8步生成的libfirstdylib.dylib拷贝到eclipse项目的libs目录下(没有可新建)

8.在DynamicRegister.java中加载库,并且调用库中函数

e2abc1f513859d3b77a3489c2b0bd9d3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值