Java原生自带的JNI,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。
可见步骤非常的多,很麻烦,使用JNI调用.dll/.so
共享库都能体会到这个痛苦的过程。如果已有一个编译好的.dll/.so
文件,如果使用JNI技术调用,我们首先需要使用C语言另外写一个.dll/.so共享库,使用SUN规定的数据结构替代C语言的数据结构,调用已有的 dll/so中公布的函数。
JNA(Java Native Access)是一个开源的Java框架,是Sun公司推出的一种调用本地方法的技术,是建立在经典的JNI基础之上的一个框架。之所以说它是JNI的替 代者,是因为JNA大大简化了调用本地方法的过程,使用很方便,基本上不需要脱离Java环境就可以完成,那么JNA调用C/C++的过程大致如下:
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.2</version>
</dependency>
编写动态连接库,这里就用Golang
来写了,用C/C++
同理
package main
import "C"
import "fmt"
func main() {
}
//export Hello
func Hello() {
fmt.Println("From dll : golang")
}
//export Add
func Add(a, b int) int {
return a + b
}
//export Msg
func Msg() string {
return "Hello,This is a msg!"
}
编译为dll
go build -buildmode=c-shared -o test.dll main.go
编写接口,并引入动态链接库
public interface TestDll extends Library {
// 此处要么使用绝对路径,要么就使用文件名并把dll放在jdk的bin目录下
TestDll Test_Dll = (TestDll) Native.loadLibrary("E:\\go-project\\demo\\test",TestDll.class);
void Hello();
int Add(int a,int b);
}
调用
public static void main(String[] args) {
TestDll.Test_Dll.Hello();
System.out.println(TestDll.Test_Dll.Add(1,2));
}