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

发布了101 篇原创文章 · 获赞 546 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/yuan1164345228/article/details/103831833