之前发在我的CSDN博客中,现在搬到简书上来。
Java可以通过JNI/JNA调用本地其他语言生成的库文件。以调用c语言为例,可以将c的函数导出dll,java通过JNI/JNA来调用。
本文涉及范围
- window平台
- Java调用c/c++
JNI vs JNA
JNI | JNA |
---|---|
c和Java互调 | 只能Java调c |
编写复杂,需要先根据Java生成对应c的函数声明,然后用c来完成函数实现,最后生成dll,供Java调用 | 直接由c生成dll供Java调用 |
性能优于JNA | 底层调用JNI |
Java通JNA调用dll
- 编写c代码,导出dll
// myDll.h
#define JNADLL extern "C" __declspec(dllexport)
JNADLL int add(int x, int y);
// myDll.cpp
#include "myDll.h"
void int add(int x, int y)
{
return x + y;
}
- 编写Java接口代码
// dll接口
public interface JNATestDll extends Library
{
JNATestDll instanceDll = (JNATestDll)Native.loadLibrary("myDll",JNATestDll.class);
public int add(int x, int y);
}
// 测试驱动
public class CallDLLJNA
{
public static void main(String[] args)
{
JNATestDll jnaDemo=JNATestDll.instanceDll;
int c = jnaDemo.add(1, 2);
System.out.println(c);
}
}
不得不看
- 待导出的c函数前一定要添加extern "C",不然导出的dll JNA找不到
#define JNADLL extern "C" __declspec(dllexport)
JNADLL int add(int x, int y);
- 导出的dll在Java工程的存放路径(任意路径皆可,推荐第一种)
- lib/win32-x86-64 文件下, 将此文件设为资源文件(此路径在Intellij IDEA上测试过,Eclipse未测试)
- 将dll所在路径设为环境变量
- 本地JDK路径下
- 系统System32文件夹下
图片源自网络,侵权必删!
网友评论