准备工作
JNative官方主页:http://jnative.free.fr/SPIP-v1-8-3/
JNative包下载:https://sourceforge.net/projects/jnative/
需要32位GCC + 32位JDK
注意事项:
- 1.4RC3版本的JNative.jar中的lib-bin中自带了JNativeCpp.dll, 所以不需要再为JNative.jar配置JNativeCpp.dll
- JNative只支持32位的JDK, 64位的系统需要安装32位的JDK来使用JNative, 否则会报错:
java.lang.IllegalStateException: JNative library not loaded, sorry !
- 32程序Java程序调用64位gcc编译的dll动态库时,会显示找不到xxx.dll
一、编写C语言程序
mylib.h头文件(考虑了GCC和MS VC两种编译器)
#ifndef _MYLIB_H_
#define _MYLIB_H_
#ifdef _MSC_VER
_declspec(dllexport) int add(int a, int b);
#endif
#ifdef __GNUC__
int add(int a, int b);
#endif
#endif
test.c文件
#include <stdio.h>
#include "mylib.h"
int add(int a, int b){
printf("dll function add() called\n");
return (a + b);
}
二、编译成dll
扫描二维码关注公众号,回复:
12908545 查看本文章

这里使用MinGW来进行编译, 需要先安装MinGW
> gcc -Wall -shared mylib.c -o mylib.dll
如果使用微软的编译器cl的话, 编译命令为
> cl mylib.c /link /out:mylib.dll /dll /OPT:NOWIN98 /machine:x86
这样就获得了mylib.dll文件
三、使用JNative调用dll
Main.java文件
import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
// 使用32位jdk
public class Main {
public static int nativeAdd(int a, int b) throws NativeException, IllegalAccessException {
JNative jNative = null;
jNative = new JNative("mylib.dll", "add");
jNative.setRetVal(Type.INT);
jNative.setParameter(0, a);
jNative.setParameter(1, b);
jNative.invoke();
System.out.println("返回:" + jNative.getRetVal());
return Integer.parseInt(jNative.getRetVal());
}
public static void main(String[] args) {
try {
// 调用
nativeAdd(1, 2);
} catch (NativeException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
执行命令:
> javac -cp JNative.jar Main.java
> java -classpath JNative.jar; Main
dll function add() called
返回:3
附录
mingw32下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/
选择离线包i686-win32-sjlj
(注:下载完mingw32之后直接编译可能提示liblto_plugin-0.dll not found,所以需要下载liblto_plugin-0.dll放在安装磁盘点的对应目录下,比如我的是 D:\mingw32\libexec\gcc\i686-w64-mingw32\8.1.0 )
jdk8u202下载,官方归档:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html
(注:oracle官网下载的jdk8u241我这安装不上,下载完点击下一步直接没反应了,不知道是不是和jdK收费有关系,目前没解决方法)
参考