1、JNA

JNI和JNA

Java原生自带的JNI,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。

img

可见步骤非常的多,很麻烦,使用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++的过程大致如下:

img

使用

依赖

<dependency>
	<groupId>net.java.dev.jna</groupId>
	<artifactId>jna</artifactId>
	<version>4.5.2</version>
</dependency>

Golang部分

编写动态连接库,这里就用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

Java部分

编写接口,并引入动态链接库

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));
}