windows上如何用32位JRE加载32位的dll库

最近在项目中遇到一个问题,工程代码默认是用64位JRE执行的,但有个需求需要用到32位dll库,于是直接通过 

System.loadLibrary 去加载该库,发现一直卡在这里,不继续往下走了,也没抛任何异常。于是写了个demo,发现抛出了 UnstatisfiedLinkError Can't load IA 32-bit .dll on a AMD 64-bit platform,然后一目了然,意思是说 无法在64位平台上加载32位,然后去本地环境的 jre/bin 目录执行了 java -version,发现果然是64位,于是在代码里面通过32位JRE去加载dll库,代码如下:
String javaPath = "/system/jre32/bin/java";
List<String> commands = new ArrayList<>();
commands.add(javaPath);
String str = LIB_PATH + ";test.jar"; // jar包的路径
commands.add("-cp"); // 可以去看下 java -cp 命令的用法
commands.add(str);
commands.add("com.leon.demo.Main");
commands.add("arg1"); // 传给Main类的参数1
commands.add("arg2"); // 传给Main类的参数2,还可以继续添加参数
ProcessBuilder processBuilder = new ProcessBuilder(commands);
File dir = FileUtils.getFile("jarpath"); // jar包的路径
// 切换工作目录,切换到jar包所在的目录
processBuilder.directory(dir);
processBuilder.redirectErrorStream(true);
Process process;
try {
    process = processBuilder.start();
} catch (IOException e) {
    
}

StringBuilder result = new StringBuilder();
BufferedReader reader = null;
try {
    reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk"));
} catch (UnsupportedEncodingException e) {
    
}

try {
    String line = null;
    if (reader != null) {
        line = reader.readLine();
    }
    while (!StringUtils.isEmpty(line)) {
        result.append(line);       
        if (reader != null) {
            line = reader.readLine();
        }
    }
    if (reader != null) {
        reader.close();
    }

    process.waitFor();
} catch (IOException e) {
   
} catch (InterruptedException e) {
    
}

int exit = process.exitValue();

这里通过启动一个32位的进程,把参数传递给Main这个class,Main.java 写法大致如下:

public static void main(String[] args) {
    String arg1 = args[0]; // 上面传过来的第一个参数
    String arg2 = args[1]; // 上面传过来的第二个参数
    try {
        System.loadLibrary("XXXX");        
    } catch (Exception ex) {        
    }
}

以上就是解决这次问题的经验,记录下。

猜你喜欢

转载自blog.csdn.net/Xia_Leon/article/details/103263872