【问题标题】:How to call c++ functionality from java如何从java调用c++功能
【发布时间】:2010-11-15 15:46:34
【问题描述】:

我有一个主要是 GUI 的 Java 程序,它显示从 c++ 命令行工具写入 xml 文件的数据。现在我想在java程序中添加一个按钮来刷新数据。这意味着我的程序必须调用 c++ 功能。

通过系统调用从java调用程序的最佳方式是什么? c++ 程序将针对 mac os 和 windows 进行编译,并且应始终与 java 程序位于同一目录中。

我想生成一个可执行文件,可以将c程序存储在jar中并从我的程序中调用吗?

【问题讨论】:

    标签: java c++ jar java-native-interface system-calls


    【解决方案1】:

    如果您可以访问代码并希望获得与外部程序的“交互”体验(例如,进行调用、获取结果、进行其他调用),请研究 JNI,它允许您从 Java 调用 C 或 C++ 代码应用程序通过包含和链接 JNI juice 到您的 C 或 C++ 应用程序。

    见:

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

    http://www.acm.org/crossroads/xrds4-2/jni.html

    如果您真的只需要“启动应用程序并获得结果”之类的解决方案,请查看 Runtime.exec(),它可以让您启动外部程序并捕获其输出。

    见: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

    http://www.rgagnon.com/javadetails/java-0014.html

    【讨论】:

      【解决方案2】:

      假设没有更好的通信方法可用(SOAP、ICE、套接字等),我将使用Runtime.exec() 调用可执行文件。 JNI 可以直接用于接口,但我不推荐它。不,您不能将可执行文件放入 jar 中。好吧,你可以,但你不能运行它,因为 shell 不知道如何运行它。

      【讨论】:

      • JNI 出了什么问题?它的存在是有原因的,而且它在性能方面肯定比启动一个单独的进程要好得多。
      • JNI 的问题是,如果你犯了一个错误,你的 JVM 很容易崩溃。如“段错误:代码转储”。
      • @Pavel:不太便携,不太稳定,耦合更紧密
      【解决方案3】:

      您可能还想查看Java Native Access API (JNA)

      【讨论】:

        【解决方案4】:

        要回答您的最后一个问题,您不能从 jar 中运行可执行文件。

        但是,您可以将其存储在您的 jar 中,并在运行之前将其解压缩到一个临时目录/文件中(第一次检查它是否存在并在必要时解压缩)。这将在一定程度上简化您的分发,因为您只有要分发的 jar,并确保您运行的可执行文件与您的 jarred Java 代码相匹配。

        【讨论】:

        • 我曾经做过类似的事情。工作得很好,但我不确定如果你的程序需要在不同的平台上工作是否会很困难。
        猜你喜欢
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多