Advertisement
cubecube

JNIにおいてC側の標準出力をJava側で受け取る

Dec 11th, 2013
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. 検証済み。一応動いた。
  2.  
  3. ■C側
  4. char abname[] = "foobar"; //ソケットの名前
  5. int fd;
  6. struct sockaddr_un sockAddr;
  7. socklen_t len;
  8.  
  9. fd = socket(AF_LOCAL, SOCK_STREAM, PF_UNIX); //ローカルソケットをオープン
  10.  
  11. sockAddr.sun_family = AF_LOCAL; //ローカルソケット
  12. sockAddr.sun_path[0] = '\0'; //抽象ソケットのお約束
  13. strcpy(sockAddr.sun_path + 1, abname); //sun_pathの2バイト目以降にソケットの名前をコピー
  14. len = sizeof(sockAddr.sun_family) + 1 + strlen(abname); //抽象ソケットのお約束
  15.  
  16. connect(fd, (const struct sockaddr *)&sockAddr, len); //接続開始
  17.  
  18. dup2(fd, 1); //標準出力の出力先をfdに切り替え
  19. close(fd); //fdは多分不要なので閉じる
  20.  
  21. //これ以降、標準出力が全部ソケットに流れるようになる
  22.  
  23. ■Java側
  24. LocalServerSocket stdinoutserver = new LocalServerSocket("foobar"); //ローカルソケットをサーバーとしてオープン
  25.  
  26. //ここ以降はブロッキングが発生するので別スレッドで
  27. LocalSocket stdinout = stdinoutserver.accept(); //待ち受け開始
  28. InputStream ins = stdinout.getInputStream(); //ストリームに変換
  29.  
  30. //受け取り処理
  31. byte[] buf = new byte[1024];
  32. int len;
  33. while ((len = ins.read(buf)) >= 0) {
  34. String str = new String(buf);
  35. //strをどうにかこうにかする
  36. }
  37. //受け取り処理ここまで
  38.  
  39. ins.close(); //閉じる
  40. stdinout.close(); //閉じる
  41. //スレッドでの処理ここまで
  42.  
  43. stdinoutserver.close(); //閉じる
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement