最近在项目中遇到一个问题,工程代码默认是用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) {
}
}
以上就是解决这次问题的经验,记录下。