我有一个已经存在的Objective-C控制台应用程序。 我不是开发它的人,因此我无法轻松访问代码。所以更改代码可能不是一个选项,但我所知道的是,对于编译,它需要Cocoa和SystemConfiguration。 (我在电子邮件中被告知) 一旦运行,它会有一个等待命令的提示,并且在该命令之后有一个文本输出结果。 有没有办法让我可以使用这个应用程序并在java中运行它并捕获输出?
我之前从未做过OSX开发,但我知道C代码可以很好地与Java一起工作,而Obj-c是C的超集,但是根据框架要求,很明显在代码中的某个地方使用了对象。
我见过像rococoa这样的东西但是在一段时间内没有更新(2009)它是否仍然适用于山狮?
答案 0 :(得分:2)
当你说你有一个Objective-C应用程序时,你的意思是你有一个为Mac OS编译的二进制/可执行文件?
如果是这样,您可以Class ProcessBuilder创建操作系统进程。
Process p = new ProcessBuilder("myCommand", "myArg").start();
注意:此解决方案仅适用于Mac OS X.此外,您可能会遇到一些安全问题,因为Java喜欢在沙盒中运行。
答案 1 :(得分: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
答案 2 :(得分:0)
如果这个列表很全面,那么就没有纯粹的Objective-C解决方案。
http://en.wikipedia.org/wiki/List_of_JVM_languages
您的下一个选项是从Java调用C的解决方案 - 这本身对Google来说很容易,因此我不会在此处包含信息 - 或者更多的解耦解决方案(很可能是您想要的),例如:使用消息总线,例如ZeroMQ或RabbitMQ。
我强烈建议避免桥接两种语言,除非您有特别不寻常的架构或硬件要求。桥接两种语言是O(n ^ 2)API,用于学习语言数量,实现消息队列是O(n)。