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
上一篇: 表单form
下一篇: 浏览器内核之渲染基础
推荐阅读
-
Yii2框架那些折磨人的坑
-
关于vue-router 中参数传递的那些坑(params,query)
-
工作中可能遇到的难以发现的坑——相似字符问题
-
SpringBoot项目使用RedisTemplate遇到key值\xac\xed\x00\x05t\x00的坑
-
QT攻略——我在QT中遇到的那些坑
-
NET Framework项目移植到NET Core上遇到的一系列坑(2)
-
AntD框架的upload组件上传图片时遇到的一些坑
-
Android Studio 3.x版本 的输入法遇到的坑及解决方案
-
html标签从.net framework转移到.net standard(.net core 2.2)时遇到的坑及填坑
-
详解安装mitmproxy以及遇到的坑和简单用法