1

すでに存在するObjective-Cコンソールアプリケーションがあります。私はそれを開発した人ではないので、コードに簡単にアクセスすることはできません。したがって、コードを変更することはオプションではないかもしれませんが、私が知っていることは、コンパイルにはCocoaとSystemConfigurationが必要であるということです。(私は電子メールで言われました)実行すると、コマンドを待機するプロンプトが表示され、そのコマンドの後にテキスト出力結果が表示されます。このアプリケーションをJava内で実行し、出力をキャプチャする方法はありますか?

私はこれまでOSX開発を行ったことがありませんが、CコードはJavaでうまく機能し、Obj-cはCのスーパーセットですが、フレームワーク要件があるため、オブジェクトがコードのどこかで使用されていることは明らかです。

私はロココアのようなものを見たことがありますが、しばらくの間(2009年)更新されていませんが、それでもマウンテンライオンで動作しますか?

4

3 に答える 3

2

あなたがObjective-Cアプリケーションを持っていると言うとき、それは本当にあなたがMac OS用にコンパイルされたバイナリ/実行可能ファイルを持っていることを意味しますか?

その場合は、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。

特に特殊なアーキテクチャやハードウェア要件がない限り、2 つの言語をブリッジすることは避けることを強くお勧めします。2 つの言語の橋渡しは O(n^2) API で言語の数を学習でき、メッセージ キューの実装は O(n) です。

于 2013-03-04T23:06:00.103 に答える