欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JNA遇到的那些坑

程序员文章站 2022-05-14 23:46:21
...

一.先给出一个简单的例子(来源于网络)
将下载的jna-5.3.1.jar和jna-platform-5.3.1.jar导入Java项目中
JNA遇到的那些坑
我们示例在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遇到的那些坑
另外,JNA还支持类型映射定制,比如有的Java中可能找不到对应的类型(在Windows API中可能会有很多类型,在Java中找不到其对应的类型),JNA中TypeMapper类和相关的接口就提供了这样的功能。
6)指针
在JNA中模拟指针,最常用到的就是Pointer类和PointerByReference类。Pointer类代表指向任何东西的指针,PointerByReference类表示指向指针的指针。Pointer类更加通用,事实上PointerByReference类内部也持有Pointer类的实例。
JNA遇到的那些坑
三、附一个JNI、JNA使用的例子
https://github.com/remram44/java-cpp-example