idea jni dll打包进jar

11 篇文章 0 订阅
本文介绍了在IntelliJ IDEA中如何将DLL文件封装进Java项目的jar包,并解决运行时链接库错误的问题。通过创建ARtifacts,添加META-INF目录,加载dll到缓存,然后打包并测试,确保jar包能正确运行。同时提供了详细的步骤和代码示例。
摘要由CSDN通过智能技术生成

背景:

把带有底层驱动和算法的dll文件封装进jar包,项目里正常执行,封装的jar包调用就报链接库错误。

也有很多小伙伴出现了这个问题。。。

 解决方案:

此时你的目录结构最起码是这样的:

并且运行是成功的。

1.新建ARtifacts

选择你要打包的module,选择Main Class

 OK之后:

 此时打包的jar会报错。

原因是缺少了META-INF文件,右键你的jar,选择Create Directory:

 

 新建META-INF,在此文件夹下,右键

 OK就好。

这样打的jar包就已经带了dll了。

2.加载dll

一般JNI都是用System.loadLibrary的方式:

static {
    System.loadLibrary("aaa");
    System.loadLibrary("bbb");
}

 这样就会出现本地项目代码运行没问题,但是jar包会提示找不到llb:

 在loadLibrary那块加一下代码,将dll读取到缓存:

private static void loadLibrary(String libName){
        try {

            InputStream in = Main.class
                    .getResourceAsStream("/lib/" + libName);   // dll文件位置

            File ffile = new File("");
            String filePath = null;
            filePath = ffile.getAbsolutePath() + File.separator
                    + libName;

            File dll = new File(filePath);
            FileOutputStream out = new FileOutputStream(dll);   //缓存dll位置

            int i;
            byte[] buf = new byte[1024];
            try {
                while ((i = in.read(buf)) != -1) {
                    out.write(buf, 0, i);
                }
            } finally {
                in.close();
                out.close();
            }
            System.load(dll.getAbsolutePath());//
            dll.deleteOnExit();

        } catch (Exception e) {
            System.err.println("load jni error!");
//            e.printStackTrace();
        }
    }

之后可以尝试运行一下,是不妨碍也运行成功了的。

关于路径,我这边是/lib/下。

 3.打包

Build -> Build Artifacts,选择Build或者Rebuild都行。

在 module,与src同级的out文件夹下生成jar。

4.检验是否成功

可以用java -jar检测一下,当然Main里面得写好测试代码。

 也可以建个demo运行一下:

参考:

这篇文章是指导方向的,但是我也是摸了一会儿石头过河,因为idea升级等原因原有博客很多地方都变了:

IntelliJ Idea+javafx+第三方库+dll 打包为jar - it610.com

这篇是关于打jar包的:

IDEA打包项目模块生成jar包_xichanjuan6481的博客-CSDN博客_idea 模块打包

不过文字比较多,我上面也简单的总结了一下。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Java中使用JNI(Java Native Interface)调用DLL(Dynamic-Link Library)中间件需要以下步骤: 1. 创建Java类和本地方法声明:首先,在Java类中声明本地方法。本地方法声明使用`native`关键字,并且没有方法体。例如: ```java public class MyDLL { public native void myFunction(); } ``` 2. 生成JNI文件:运行`javac`命令编译Java类,然后使用`javah`命令生成JNI文件。在命令行中切换到包含Java类的目录,并执行以下命令: ```shell javac MyDLL.java javah MyDLL ``` 这将生成名为`MyDLL.h`的头文件。 3. 编写C/C++实现:使用生成的JNI文件作为C/C++代码的基础,实现本地方法。在C/C++文件中,包含生成的头文件并实现本地方法。例如: ```c #include "MyDLL.h" JNIEXPORT void JNICALL Java_MyDLL_myFunction(JNIEnv *env, jobject obj) { // 实现DLL中间件的功能 } ``` 4. 编译C/C++代码为DLL:使用适当的编译器将C/C++代码编译为DLL。具体步骤取决于所使用的编译器和操作系统。 5. 加载和调用DLL:在Java代码中加载并调用DLL。在Java代码中,使用`System.loadLibrary()`方法加载DLL,并调用本地方法。例如: ```java public class Main { static { System.loadLibrary("mydll"); } public static void main(String[] args) { MyDLL mydll = new MyDLL(); mydll.myFunction(); } } ``` 在上述示例中,`System.loadLibrary("mydll")`加载名为`mydll`的DLL,然后通过创建`MyDLL`对象并调用`myFunction()`方法来调用DLL中的函数。 请注意,执行此操作需要确保DLL文件与Java代码在相同的操作系统平台和架构上兼容,并且DLL文件路径正确。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值