这是一个很大的坑。在里面遨游了两天时间,很无语
注:.dll是运行在Windows环境的。想要在Linux环境运行就是.so文件(.so就是和.dll文件一样,只不过是适用的系统环境不一样而已)
业务:
我的业务是需要调用dll文件,返回一个json格式的结果。
我们有多个应用。其中有上位机应用服务是运行在Windows环境的。因此Linux环境上的那个应用需要调用dll的接口里面组装我我们自己的业务,然后接口里面通过http去请求上位机上的接口,来调用dll文件。
起初。这个上位机在eclipse上是可以直接调用dll文件去运行的。但是idea是无法运行的。
然后上位机这个打成jar包(dll文件放在和src同级、以及src\main\resources下,还有打成war),运行在本地,报了很多错。
类似于下面的。
各种百度说是什么环境变量里面配置,
什么把dll文件复制到C:\Windows\System32、jre\bin等等路径里面、eclipse上的配置等等各种试,还说是缺少什么dll文件让下载。将dll放在java.library.path包含的路径中。都不行。
认真分析一下,eclipse上能运行,肯定就是dll文件放的位置不对。不可能是缺少什么dll文件都不行。
一直的误区是:System.loadLibrary("dll文件名,没有后缀");扫描的事jar包内或者war内的。
所以一直在这里转圈圈。最后在打成jar包。在桌面创建一个文件夹,把jar包和所要用的dll文件都复制进入都是同级。结果测试就ok。感觉真滴很坑。
以上分享给大家。具体我也不太清楚我这个方法是否适用你,但是我目前是ok了。
有什么不足之处,还希望请教大家。
在eclipse上配置后调用执行正常,但是在idea中就不行。一共有三个类型的错,大概的意思都是下面这个截图中的报错
主要的方法是:将比如将一个jar包放在Windows环境的卓某一个文件夹中,那么把所有的dll文件复制进入,和这个jar同级目录。启动这个jar,就可以正常的调用了
public class Demo {
public native int sum(int a,int b);
public static void main(String[] args) {
int a = 2;
int b = 6;
int c;
Demo d = new Demo();
c = d.sum(a, b);
}
public int getSumAB(int a, int b){
Demo d = new Demo();
int sum = d.sum(a, b);
return sum;
}
static
{
System.loadLibrary("dll文件名,没有后缀");
}
}