美文网首页
windows上如何用32位JRE加载32位的dll库

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

作者: snowyeti | 来源:发表于2021-01-07 15:58 被阅读0次

最近在项目中遇到一个问题,工程代码默认是用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) {        
    }
}

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

相关文章

网友评论

      本文标题:windows上如何用32位JRE加载32位的dll库

      本文链接:https://www.haomeiwen.com/subject/anmzoktx.html