zoukankan      html  css  js  c++  java
  • Java 加载动态库 dll 文件

    不知道具体原理,但是,加载 dll 文件时,带路径或者更改 dll 文件的名字,都会报错。虽然库记载成功了,但是处女座认为这不可接受。于是有了这个解决方案。

    在根目录为库创建软连接,然后使用 system.loadLibrary(“libname”) 来加载。事实证明,它时认软连接的。

    上代码:

    import com.seapine.surroundscm.api.*;
    import java.lang.UnsupportedOperationException;
    import java.lang.SecurityException;
    import java.io.IOException;
    import java.nio.file.*;
    
    public class SurroundSCMAPIExample {
          static {
            String arch = System.getProperty("sun.arch.data.model");
    
            Path target;
            
            if(arch.equals("32"))
            {
                target = FileSystems.getDefault().getPath("lib","sscmapi.dll");   
            }
            else
            {
                target = FileSystems.getDefault().getPath("lib64","sscmapi.dll");
            }
    
            Path link = FileSystems.getDefault().getPath("sscmapi.dll");
    
            try {
                Files.deleteIfExists(link);
                Files.createSymbolicLink(link, target);   
            } catch (IOException | UnsupportedOperationException | SecurityException e) {   
                if (e instanceof SecurityException) {   
                    System.err.println("Permission denied!");   
                }   
                if (e instanceof UnsupportedOperationException) {   
                    System.err.println("An unsupported operation was detected!");   
                }   
                if (e instanceof IOException) {   
                    System.err.println("An I/O error occurred!");   
                }   
                System.err.println(e);
            }
    
            System.loadLibrary("sscmapi");
          }
          
        public static void main(String[] args)
        {
           SSCMContext context = new SSCMContext();
           SSCMResult ret =  SSCMAPI.connectRSA("localhost",
                   4900,
                   "",
                   "admin",
                   "",
                   context);
    
           if(SSCMAPI.SSCM_API_OK == ret.result)
              System.out.println("Connection Succeeded");
           else
              System.out.println("Connection Failed: " +
                      SSCMAPI.getLastError(ret.result));
    
           SSCMAPI.disconnect(context);
        }
    }

    妥妥的,再看不到任何的报错。

    不过这个方案有个坑,如果软链接文件是 read-only 的,创建软链接就有麻烦了,所以,在打包,或者是从仓库 get 时,要主要删掉软链接文件。

  • 相关阅读:
    使用函数式语言实践DDD
    理解函数式编程中的函数组合--Monoids(二)
    理解函数式编程语言中的组合--前言(一)
    信息熵 交叉熵
    激光雷达感知方案
    卡尔曼滤波算法
    我平时用的 golang 项目结构
    记一个 aliyun tablestore go client 的大坑
    关于 signal.Notify 的一个小问题
    【Linux】【Jenkins】Linux环境搭建和遇到的问题和解决方案等
  • 原文地址:https://www.cnblogs.com/pied/p/11133413.html
Copyright © 2011-2022 走看看