如何通过ProcessBuilder在Java中调用CUDA C应用程序?

如何通过ProcessBuilder在Java中调用CUDA C应用程序?,java,cuda,processbuilder,Java,Cuda,Processbuilder,我有一个非常复杂的应用程序,它使用CUDA,并且是用C编写的。这个应用程序只是命令行,现在我想用JavaSwing构建一个GUI 我不想重写C代码,所以我使用ProcessBuilder对象调用命令行版本。这样我就可以从中读取消息并在GUI内的控制台上显示 这是我正在使用的代码: String command = "myApp"; pb = new ProcessBuilder("bash", "-c",command); pb.redirectErrorStream(true); Proces

我有一个非常复杂的应用程序,它使用CUDA,并且是用C编写的。这个应用程序只是命令行,现在我想用JavaSwing构建一个GUI

我不想重写C代码,所以我使用ProcessBuilder对象调用命令行版本。这样我就可以从中读取消息并在GUI内的控制台上显示

这是我正在使用的代码:

String command = "myApp";
pb = new ProcessBuilder("bash", "-c",command);
pb.redirectErrorStream(true);
Process shell;
try {
        shell = pb.start();
        InputStream shellIn = shell.getInputStream();
        Drawer.writeToLog(convertStreamToStr(shellIn));
        shellIn.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

public String convertStreamToStr(InputStream is) throws IOException{
    if(is != null){
        Writer writer = new StringWriter();

        char[] buffer = new char[1024];
        Reader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
        int n;
        while((n = reader.read(buffer)) != -1){
            writer.write(buffer,0,n);
        }
        is.close();
        return writer.toString();
    }else{
        return "";
    }
}
如果我尝试类似于“ls”命令的方法,效果会很好。但是,对于我的应用程序,我遇到以下错误:

./myApp: error while loading shared libraries: libcudart.so.5.0: cannot open shared object file: No such file or directory
CUDA已安装并在我的机器中正确配置,我可以从终端正确执行此应用程序。我猜想错误来自Java虚拟机


如何修复它?

这段代码适合我,我刚刚测试过:

System.out.printf("[Starter#main] !\n");
final ProcessBuilder builder = new ProcessBuilder("absolute/path_to/your/executable");
builder.redirectErrorStream(true);
builder.environment().put("LD_LIBRARY_PATH",
    "/usr/local/cuda/lib64:/usr/local/cuda/lib");
final Process start = builder.start();
final InputStream outputStream = start.getInputStream();
final BufferedReader reader = new BufferedReader(new InputStreamReader(outputStream));
String s;
while ((s = reader.readLine()) != null) {
    System.out.printf("[Starter#main] %s\n", s);
}
格查斯:

  • 确保您的应用程序比特数与工具箱匹配
  • Mac OS X变量称为“DYLD\u LIBRARY\u PATH”
  • 另请注意:

  • 派生的进程将从您的Java进程继承环境,也就是说,若您运行Java应用程序时按照CUDA toolkit安装程序的建议配置了PATH和LD_LIBRARY_路径,那个么它应该可以正常工作
  • 您可以在shell脚本中外部化变量设置和启动您的应用程序,然后您只需使用给定脚本运行shell即可

  • 确保此库位于$LD_library_路径的目录中JVM可能不遵守普通库加载路径。您可以尝试将libcudart.so复制到myApp所在的位置,看看它是否可以通过这种方式找到它。明白了。看起来需要添加:builder.environment().put(“LD_LIBRARY_PATH”,“/usr/local/cuda/lib64:/usr/local/cuda/lib”);正确设置ProcessBuilder。非常感谢=)