0

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仮想マシンからのものだと思います。

どうすれば修正できますか?

4

1 に答える 1

1

このコードは私のために機能します、私はちょうどそれをテストしました:

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);
}

落とし穴:

  1. アプリケーションのビット数がツールキットと一致していることを確認してください。
  2. Mac OS X 変数は「DYLD_LIBRARY_PATH」と呼ばれます

また、次の点に注意してください。

  1. 生成されたプロセスは、Java プロセスから環境を継承します。つまり、CUDA ツールキット インストーラーのアドバイスに従って、PATH および LD_LIBRARY_PATH を構成して Java アプリケーションを実行すると、正常に動作するはずです。
  2. シェル スクリプトで変数の設定とアプリの起動を外部化することができます。その後は、指定されたスクリプトでシェルを実行するだけです。
于 2013-01-23T18:51:54.900 に答える