java 调用dll文件,jar包调用dll文件

原创
10/16 10:46
阅读数 50

java调用dll文件,可以用

System.load()  或者 System.loadLibiary()

个人认为loadLibiary不太好,需要把dll放在system32路径下,项目每个人员都要本地这样做,后期部署也需要这样弄。

所以用的load,将dll放到resource下来读取.... 

System.load(JNIMapUtil.class.getResource("").getPath()+("dll/DwgOperInterface.dll"));

本机调试一直都没问题,后来打jar包运行,就访问不到了,因为jar里面的dll文件对于系统来说不是路径

以下是解决方法:项目运行的时候,

JNIMapUtil.class.getResourceAsStream() 读取流,然后存到系统临时表里,最后load()加载,代码如下:
@PostConstruct
private void initDll() throws IOException {
    //复制一份dll放到系统临时文件夹中,处理jar包,dll无法读取问题
    loadLib("DwgOperInterface");
    log.info("加载dll成功...");
}

/**
 *  复制一份dll放到系统临时文件夹中,处理jar包,dll无法读取问题(代替loadLibrary * @author sunboqiang
 * @date 2020/10/16
 */
private synchronized static void loadLib(String libName) throws IOException {
    //BIN_LIBJAR包中存放DLL的路径
    //getResourceAsStreamJAR中根路径为开始点
    String systemType = System.getProperty("os.name");
    String libExtension = (systemType.toLowerCase().indexOf("win")!=-1) ? ".dll" : ".so";

    String libFullName = libName + libExtension;

    String nativeTempDir = System.getProperty("java.io.tmpdir");

    InputStream in = null;
    BufferedInputStream reader = null;
    FileOutputStream writer = null;

    File extractedLibFile = new File(nativeTempDir+File.separator+libFullName);
    try {
        String dllUrlInJar = "/dll/";
        in = JNIMapUtil.class.getResourceAsStream(dllUrlInJar + libFullName);
        if(in==null)
            in =  JNIMapUtil.class.getResourceAsStream(libFullName);
        JNIMapUtil.class.getResource(libFullName);
        reader = new BufferedInputStream(in);
        writer = new FileOutputStream(extractedLibFile);

        byte[] buffer = new byte[1024];

        while (reader.read(buffer) > 0){
            writer.write(buffer);
            buffer = new byte[1024];
        }
    } catch (IOException e){
        e.printStackTrace();
    } finally {
        if(in!=null)
            in.close();
        if(writer!=null)
            writer.close();
    }
    //系统价值dll文件
    System.load(extractedLibFile.toString());
}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部