Cómo cargar la biblioteca dll de 32 bits con JRE de 32 bits en Windows

Recientemente encontré un problema en el proyecto. El código del proyecto es ejecutado por JRE de 64 bits de forma predeterminada, pero hay un requisito que requiere una biblioteca dll de 32 bits, así que lo pasé directamente 

System.loadLibrary fue a cargar la biblioteca y la encontró atascada aquí todo el tiempo. Dejé de bajar y no arrojé ninguna excepción. Así que escribí una demostración y descubrí que UnstatisfiedLinkError Can't load IA de 32 bits .dll en una plataforma AMD de 64 bits se lanzó , y luego quedó claro de un vistazo, lo que significaba que 32 bits no se podían cargar en un Plataforma de 64 bits , y luego en el entorno local ejecuté java -version en el directorio jre / bin y descubrí que era de 64 bits, así que cargué la biblioteca dll a través de JRE de 32 bits en el código. El código es como sigue:
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();

Aquí, al iniciar un proceso de 32 bits, pasando los parámetros a la clase Main, Main.java se escribe aproximadamente de la siguiente manera:

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

Lo anterior es la experiencia de solucionar este problema, regístrelo.

Supongo que te gusta

Origin blog.csdn.net/Xia_Leon/article/details/103263872
Recomendado
Clasificación