【问题标题】:Call a C program in Java [closed]用Java调用C程序[关闭]
【发布时间】:2017-04-26 14:33:11
【问题描述】:

我知道已经有一些关于此的帖子,但没有一个回答我的问题。

情况是这样的,我有用 C 编写的程序,但我用 java 开发了我的 GUI。所以我需要做的是,当我单击按钮或组合框时调用我的 C 程序。

为了做到这一点,是否可以只编译 C 程序,然后在我的 java 接口中调用它? (如果可能的话,我该怎么做?)。

或者我是否必须使用 JNI ? (我已经阅读了一些关于它的帖子,但是对于一个项目来说学习它似乎很复杂)。

【问题讨论】:

  • 是的,你必须使用 JNI 从 Java 调用本机方法
  • 如果您需要 C 代码与 Java 程序互操作,那么使用 JNI(或 JNA)是正确的解决方案。如果你只是想启动一个已编译的程序,那么你可以通过系统命令执行它(注意这会导致很多其他问题)
  • 这不会有好的结局。你应该更仔细地考虑这一点。将该 C 程序移植到 Java。是时候了。你会省去很多心痛。通过重用 C 可执行文件所带来的“节省”并不值得。
  • 谢谢,但我想我会使用下面提到的 Runtime.getRuntime().exec()。这是针对学校的一个项目,我们完成了教授提供的 C 文件,我知道使用 JNI 会更好,但我没有时间这样做。此外,我什至不知道 C 文件中使用的每个函数,所以我认为我无法将其移植到 Java 中。
  • 很公平。听起来你的教授被困在 1990 年。太糟糕了。

标签: java c call


【解决方案1】:

为了获得最大的互操作性,您应该使用 JNI,但作为一种简单的方法,只需编译 C 代码并使用 Runtime.getRuntime().exec() 从 JAVA 调用 C 可执行文件。

如果你在 UNIX 下阅读响应,你可以这样做:

String line;
Process p = Runtime.getRuntime().exec( "/path/to/C/executable" );

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = in.readLine()) != null) {
    System.out.println(line);
}
in.close();

【讨论】:

  • Runtime.exec 很久以前就被 ProcessBuilder 淘汰了。
  • @VGR 是的,抱歉...自从我上次使用 Java 以来已经有一段时间了...如果您愿意,可以编辑我的答案
猜你喜欢
  • 2021-03-26
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多