前言
个人拙见:java也不是万能的,对于一些底层的处理或者使用已经写好的C的代码,java就要寄出两大法宝:JNI和JNA。JNI和JNA其实很相似,但是如果对速度要求不高的情况下,我个人选择使用起来较为容易的JNA。
JNA可以直接调用C/C++编写的DLL文件
这个就是我们为什么要使用JNA的原因了。
准备工作
下载导入两个jar
https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna/4.0.0/jna-4.0.0.jar
https://maven.java.net/content/repositories/releases/net/java/dev/jna/jna-platform/4.0.0/jna-platform-4.0.0.jar
简单示例
代码结构:

代码示例:
package lyrics;
import com.sun.jna.Library;
import com.sun.jna.Native;
public class JNATest {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("msvcrt",CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args){
try{
CLibrary.INSTANCE.printf("Hello, World!!");
}catch(Exception e){
e.printStackTrace();
}
}
}
类型对照
首先 int肯定是int了,这些基础的都差不多
比较值得一提的是以下这些比较骚的操作
1.boolean该怎么办?
这个建议转换为byte读取
2.char* 、const char *、const unsigned char *对应什么?
相信我,统统用String。
3.&反写的数据该怎么弄,如&int?
IntByReference.
4.结构体呢?
结构体 * -> Pointer
结构体 ** -> PointerByReference
5.IntByReference,PointerByReference怎么取值?
getvalue,getString,getByte,get……
getPoint,getPointArray()……
具体问题具体分析,结合C++中结构体的声明定义,组合上面的这些方法就能得到相应的值。
注意
调用动态库可能会遇到一些问题:
1.直接报找不到动态库?
这种情况一般是你动态库路径不对,拼写不对,或者多写了.dll这几个字符,当然前提是你要导入jar
2.报在classpath中找不到什么什么东西?
这种情况有可能是你调用的动态库需要其他动态库支持,你没有复制完动态库。
3.致命错误,无法启动虚拟机什么的?
检查自己环境配置,jre是不是1.8,编译环境是不是1.8等等
4.不是有效32位或64位dll文件?
这种情况可能是,你的动态库是64位或者32位,而你eclipse不是或者说jre不是,两者不匹配导致等等。
本文介绍如何使用Java Native Access (JNA) 库调用C/C++编写的动态链接库(DLL),包括JNA的准备工作、代码示例及常见问题解决方法。

3410

被折叠的 条评论
为什么被折叠?



