2013-03-04 164 views
1

我有一個已經存在的Objective-C控制檯應用程序。 我不是那個開發它的人,所以我不能輕鬆訪問代碼。所以改變代碼可能不是一種選擇,但我知道的是編譯時需要Cocoa和SystemConfiguration。 (我在電子郵件中被告知) 一旦運行,它會有一個提示等待命令,並在該命令後面有一個文本輸出結果。 有沒有一種方法可以讓這個應用程序在java中運行並捕獲輸出?有沒有辦法從java執行Objective-C應用程序?

我從來沒有做過OSX開發,但我知道C代碼可以很好地與Java和Obj-c一起工作,但C是C的超集,但是對於框架需求,似乎很清楚在代碼中某處使用了對象。

我曾經見過像洛可可這樣的東西,但在一段時間內還沒有更新(2009年)它是否仍然與山獅一起工作?

+0

可以運行的Objective-C程序作爲「控制檯」的應用程序,並捕獲「控制檯」輸出,使用Java。我已經做到了(很久以前),我相信使用Runtime.exec。棘手的部分是捕獲控制檯輸出 - 它需要一個異步線程或其他特性。 – 2013-03-04 23:11:54

+0

看着Runtime.exec我被提醒它返回一個Process對象。被調用的應用程序的控制檯輸出可通過Process的「getInputStream」方法獲得。當然,它必須是字符模式數據。 – 2013-03-04 23:15:31

回答

2

當你說你有一個Objective-C應用程序時,你的意思是你有一個爲Mac OS編譯的二進制/可執行文件?

如果是這樣,您可以使用Class ProcessBuilder來創建操作系統進程。

Process p = new ProcessBuilder("myCommand", "myArg").start(); 

注:該解決方案將只在Mac OS X上運行你也可能有一些安全問題,因爲Java愛在沙箱中運行。

+0

謝謝,明天我會看看這個選項。 – TheNewM 2013-03-05 02:57:38

+0

感謝這是我需要的。 – TheNewM 2013-03-06 16:18:04

0

如果此列表是全面的,那麼不存在純粹的Objective-C解決方案。

http://en.wikipedia.org/wiki/List_of_JVM_languages

你的下一個選項是解決方案,以調用C從爪哇 - 這是很容易谷歌在自己的權利,所以我將不包括這裏的信息 - 或者更解耦的解決方案(這是很可能你想要什麼)例如使用消息總線,如ZeroMQ或RabbitMQ。

我強烈建議避免橋接兩種語言,除非您有特別不尋常的體系結構或硬件要求。橋接兩種語言是O(n^2)API來學習多種語言,實現消息隊列是O(n)。

1

如果你想創建一個子進程,並且還要在它和你的主程序之間交換信息,我認爲下面的代碼會對你有所幫助。

它通過調用一個二進制/可執行文件創建一個子進程,然後寫的東西(如命令)。它的輸入流,並讀取一些文字:

import java.io.*; 


public class Call_program 
{ 
    public static void main(String args[]) 
    { 
     Process the_process = null; 
     BufferedReader in_stream = null; 
     BufferedWriter out_stream = null; 

     try { 
      the_process = Runtime.getRuntime().exec("..."); //replace "..." by the path of the program that you want to call 
     } 
     catch (IOException ex) { 
      System.err.println("error on exec() method"); 
      ex.printStackTrace(); 
     } 

     // write to the called program's standard input stream 
     try 
     { 
      out_stream = new BufferedWriter(new OutputStreamWriter(the_process.getOutputStream())); 
      out_stream.write("...");  //replace "..." by the command that the program is waiting for 
     } 
     catch(IOException ex) 
     { 
      System.err.println("error on out_stream.write()"); 
      ex.printStackTrace(); 
     } 

     //read from the called program's standard output stream 
     try { 
      in_stream = new BufferedReader(new InputStreamReader(the_process.getInputStream())); 
      System.out.println(in_stream.readLine()); //you can repeat this line until you find an EOF or an exit code. 
     } 
     catch (IOException ex) { 
      System.err.println("error when trying to read a line from in_stream"); 
      ex.printStackTrace(); 
     } 
    } 
} 

參考。

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2frzaha%2fiostrmex.htm

+0

看起來很有意思,明天我會做一些工作。謝謝。 – TheNewM 2013-03-05 02:57:20

相關問題