JNA之C/C++ .so/.dll链接库调用

JNA(Java Native Access)建立在JNI之上,用来调用C/C++链接库文件(windows的dll,linux的so文件)

目录

 

测试一:运行平台winows,使用系统自带.dll

测试二:运行平台linux,使用自定义.so

测试三:运行平台windows,使用自定义.dll


测试一:运行平台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位操作系统。。。

参考文章<<<<<<<<<<<<<<<<<<<

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值