有没有办法从java执行Objective-C应用程序?

有没有办法从java执行Objective-C应用程序?,java,objective-c,Java,Objective C,我有一个Objective-C控制台应用程序已经存在。 我不是开发它的人,所以我不容易获得代码。因此,更改代码可能不是一个选项,但我所知道的是,对于编译,它需要Cocoa和SystemConfiguration。(我在电子邮件中被告知) 一旦运行,它会有一个等待命令的提示,并且在该命令之后会有一个文本输出结果。 有没有一种方法可以让这个应用程序在java中运行并捕获输出 我以前从未做过OSX开发,但我知道C代码可以很好地与Java配合使用,Obj-C是C的超集,但根据框架要求,似乎很明显,在代码

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

我以前从未做过OSX开发,但我知道C代码可以很好地与Java配合使用,Obj-C是C的超集,但根据框架要求,似乎很明显,在代码中的某个地方使用了对象


我看到过类似洛可可的东西,但已经有一段时间没有更新了(2009年)。它是否仍然适用于山狮

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

您的下一个选项是从Java调用C的解决方案-这很容易通过Google自己搜索,所以我不在这里提供信息-或更解耦的解决方案(很可能是您想要的),例如使用消息总线,如ZeroMQ或RabbitMQ


我强烈建议避免桥接两种语言,除非您有特殊的体系结构或硬件需求。桥接两种语言是O(n^2)API,要学习的语言有很多,实现消息队列是O(n)。

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

如果是这样,您可以创建操作系统进程

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

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

如果您希望创建子进程,并在它与主程序之间交换信息,我认为以下代码将对您有所帮助

它通过调用二进制/可执行文件创建子流程,然后将某些内容(如命令)写入其输入流并读取一些文本:

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();  
        }
    }
}
参考文献


您可以将Objective-C程序作为“控制台”应用程序运行,并使用Java捕获“控制台”输出。我(很久以前)就这样做了,我相信使用Runtime.exec。棘手的部分是捕获控制台输出——它需要一个异步线程或类似的东西。调用的应用程序的控制台输出可通过进程的“getInputStream”方法获得。当然,它必须是字符模式数据。看起来很有趣,我明天会做一些相关工作。谢谢。谢谢,我明天会看看这个选项。谢谢。这是我需要的。