JNA(Java Native Access)建立在JNI之上,用来调用C/C++链接库文件(windows的dll,linux的so文件)
目录
测试一:运行平台winows,使用系统自带.dll
这里使用系统中已有的C:\Windows\System32或C:\Windows\SysWOW64下的msvcrt.dll
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class JNATest {
//继承Library,用于加载库文件
public interface Clibrary extends Library{
Clibrary INSTANCE = (Clibrary) Native.load( (Platform.isWindows() ? "msvcrt" : "c"), Clibrary.class);
void printf(String format, Object... args);
}
public static void main(String...strings) {
//调用
Clibrary.INSTANCE.printf("Hello, World->%d",2019);
}
}
测试二:运行平台linux,使用自定义.so
1.在Linux编写 hello.c,这里c代码这里没使用图形化IDE
#include <stdio.h>
void test() {
printf("hello jna...");
}
2.Java部分
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
package com.example.demo.util;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class JNATest {
//继承Library,用于加载库文件
public interface Clibrary extends Library{
Clibrary INSTANTCE2 = Native.load("hello", Clibrary.class);
void test();
}
public static void main(String...strings) {
Clibrary.INSTANTCE2.test();
}
}
启动类注释掉springboot默认启动,改为执行JNATest.java的main()
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
JNATest.main();
//SpringApplication.run(DemoApplication.class, args);
}
}
3.编译及启动测试:根据hello.c编译并生成linux的链接库文件.so,再将该库文件的path配置到/etc/ld.so.conf下,最后启动java进程
[root@192 ~]# pwd
/root
[root@192 ~]# ls |grep hello
hello.c
[root@192 ~]# gcc -c hello.c
[root@192 ~]# gcc -fPIC -shared -o libhello.so hello.c
[root@192 ~]# ls |grep hello
hello.c
hello.o
libhello.so
[root@192 ~]# pwd >> /etc/ld.so.conf
[root@192 ~]# ldconfig
[root@192 ~]# java -jar demo-0.0.1-SNAPSHOT.jar
hello jna...[root@192 ~]#
测试三:运行平台windows,使用自定义.dll
linux编译得到.dll的测试失败,可能需要C/C++的visual studio/jetbrain的Clion等来编写及编译,需要分64/32位操作系统。。。
参考文章<<<<<<<<<<<<<<<<<<<