JNA遇到的那些坑

一.先给出一个简单的例子(来源于网络)
将下载的jna-5.3.1.jar和jna-platform-5.3.1.jar导入Java项目中
在这里插入图片描述
我们示例在C++/C语言生成的DLL文件代码:

extern "C" __declspec(dllexport) int add(int a, int b);
int add(int a, int b){
	return a + b;
}

add函数为JAVA要调用的函数,要对add函数之前做extern “C” __declspec(dllexport)声明。

同时生成的DLL位数要与JAVA虚拟机的位数保持一致(X64对于X64位,X86对应X86)

在JAVA端的代码如下图所示:

import com.sun.jna.Library;
import com.sun.jna.Native;
 
public interface TestJNA extends Library { 
	public abstract float add(float a,float b);
	TestJNA INSTANCE = (TestJNA) Native.loadLibrary("C_Part", TestJNA.class);
}
public class TEST { 
    public static void main(String[] args) {  	  
        System.out.println(TestJNA.INSTANCE.add(2,2));  
    }  	
}

TestJNA INSTANCE = (TestJNA) Native.loadLibrary(“C_Part”, TestJNA.class);为加载DLL链接库,“C_Part.dll”放置在工程文件的根目录下。
二、使用过程中的坑
1)如果调用的dll依赖于其它的dll,则不能简单的load这一个dll,否则会报错找不到指定的模块
2)jdk的位数和dll的位数一定要一致,否则会报错找不到指定的程序
3)路径一定要处理好,否则也会报找不到指定的模块
4)dll中的函数一定要使用external “C” ,否则会报找不到指定的程序,这是因为java只支持C方式编译的dll。
5)数据类型对应好
在这里插入图片描述
另外,JNA还支持类型映射定制,比如有的Java中可能找不到对应的类型(在Windows API中可能会有很多类型,在Java中找不到其对应的类型),JNA中TypeMapper类和相关的接口就提供了这样的功能。
6)指针
在JNA中模拟指针,最常用到的就是Pointer类和PointerByReference类。Pointer类代表指向任何东西的指针,PointerByReference类表示指向指针的指针。Pointer类更加通用,事实上PointerByReference类内部也持有Pointer类的实例。
在这里插入图片描述
三、附一个JNI、JNA使用的例子
https://github.com/remram44/java-cpp-example

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值