Java调用DLL动态链接库

何为native和jni

1、native
在Java中存在一个native关键字,被它所修饰的方法是一个本地接口方法。在Java中只需要定义该接口方法,具体操作则可以由其他语言来实现(比如C语言)。
由于Java语言的一些局限性,它不能很好的对操作系统底层进行访问和操作,但是可以通过native先声明本地方法,然后再由其他语言来实现该方法完成对操作系统底层的访问和操作。

2、jni
Sum公司发布的Java 本地接口(JNI)提供了将Java与C/C++、汇编等本地代码集成的方案,该规范使得在 Java 虚拟机内运行的 Java 代码能够与其它编程语言互相操作。
包括创建本地方法、更新Java对象、调用Java方法,引用 Java类,捕捉和抛出异常等,也允许 Java代码调用 C/C++或汇编语言编写的程序和库。通过使用 Java本地接口编写程序,可以确保代码在不同的平台上方便移植。

搭建环境

1、Windows 10(64位)

2、Jdk8(64位)

3、MinGW(64位,Dev C++内置)

4、IDEA

5、Dev C++

注意事项:打包的DLL文件位数要和操作系统的位数相对应,32位(64位)的DLL(动态链接库)不能在64位(32位)的操作系统上运行,否则在Eclipse进行操作时会抛出”Exception in thread “main” java.lang.UnsatisfiedLinkError”的错误。

定义native方法

1、在Java类中先使用native声明本地方法,具体操作由C语言来实现,方法声明如下:

/**
 * JavaJNI测试
 *
 * @author 谈笑、
 * @dateTime 2020/10/7 2:17
 */
public class JavaNativeMethods {

	/**
	 * 定义本地方法,求得两数之和。
	 *
	 * @param value1 操作数1
	 * @param value2 操作数2
	 * @return 两数之和
	 */
	public native int getSum(int value1, int value2);


	/**
	 * 定义本地方法,直接打印字符串。
	 */
	public native void print();

}


生成头文件

1、首先编译该类文件,得到.class字节码文件,如下图:

2、使用javah命令将该字节码文件转换为C语言能调用的.h头文件。在终端中进入到生产路径下的项目中,执行以下命令,如下图:

注意:如果该类在某些包下则需要使用该类的全限定名来进行操作,比如这里的JavaNativeMethods类在jni包下的c包中,所以使用javah -jni jni.c.JavaNativeMethods命令。

在执行完命令后会在生产路径下的项目中生成一个.h头文件,这个头文件内声明的方法就是在Java类中定义的本地方法,如图:


创建DLL项目

1、在Dev C++中创建DLL项目,如图:

2、移除自动生成的文件,重新创建一个main.c文件并将之前生成的.h头文件导入到项目中,如图:

3、将jni_c_JavaNativeMethods.h导入到main.c文件中,同时把jni_c_JavaNativeMethods.h中的方法复制到main.c文件中,这些方法将在main.c文件中实现。

需要注意的是,在jni_c_JavaNativeMethods.h头文件中声明的方法形参中,只有参数类型没有没有参数名称,所以需要自己补全参数名,如下图:

4、导入外部依赖文件,这些依赖文件位于JDK的目录中,我们需要将该文件引入到Dev C++的编译环境中,如图:

操作路径:工具 -> 编译器选项 -> 目录 -> C包含文件

5、编译项目,点击四个小方块进行编译,下面显示编译结果,如果没有报错则编译成功,得到最终的DLL文件,如图:


调用DLL文件

1、将生成的DLL文件导入到Java项目的lib目录中并调用,调用时不需要加上DLL文件的扩展名,如图:

最后调用成功,此次操作完美完成。

相关文件

JavaJNI.zip

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇