1

我有一个已经存在的 Objective-C 控制台应用程序。我不是开发它的人,所以我无法轻松访问代码。因此,更改代码可能不是一个选项,但我所知道的是,对于编译,它需要 Cocoa 和 SystemConfiguration。(我在一封电子邮件中被告知)一旦运行,它会提示等待命令,并且在该命令之后有一个文本输出结果。有没有办法让我可以使用这个应用程序并在 java 中运行它并捕获输出?

我以前从未做过 OSX 开发,但我知道 C 代码可以很好地与 Java 一起工作,而 Obj-c 是 C 的超集,但是根据框架要求,很明显在代码中的某处使用了对象。

我见过像 rococoa 这样的东西,但有一段时间没有更新(2009 年)它仍然适用于山狮吗?

4

3 回答 3

2

当你说你有一个 Objective-C 应用程序时,你真的是说你有一个为 Mac OS 编译的二进制/可执行文件?

如果是这样,您可以使用 Class ProcessBuilder来创建操作系统进程。

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

注意:此解决方案仅适用于 Mac OS X。此外,您可能会遇到一些安全问题,因为 Java 喜欢在沙箱中运行。

于 2013-03-04T23:18:54.597 回答
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

于 2013-03-04T23:24:28.840 回答
0

如果这个列表很全面,那么就没有纯粹的 Objective-C 解决方案。

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

您的下一个选项是从 Java 调用 C 的解决方案 - 这本身对 Google 来说很容易,因此我不会在此处包含信息 - 或者更多解耦的解决方案(这很可能是您想要的),例如使用消息总线,例如ZeroMQ 或 RabbitMQ。

我强烈建议避免桥接两种语言,除非您有特别不寻常的架构或硬件要求。桥接两种语言是 O(n^2) APIs 来学习语言的数量,实现消息队列是 O(n)。

于 2013-03-04T23:06:00.103 回答