3

只是出于兴趣,是否可以从 java 模块调用 C 模块?如果是这样,该怎么做?

4

6 回答 6

6

是的,您可以使用Java Native Interface来执行此操作:

于 2010-01-17T19:19:38.953 回答
4

是的,你可以做到。你是否应该这样做是另一回事。

在专业方面:

  • 从 Java 调用 C 库将避免在 Java 中重新编码库的需要(但见下文)。

  • 对于某些计算密集型算法,编写良好的 C 实现可能比编写良好的 Java 版本更快。

  • 某些操作系统特定的操作无法在纯 Java 中实现。

不利的一面:

  • 与简单的 Java 方法调用相比,进行 JNI 调用的开销更大。

  • 如果你的 C 库不是线程安全的,你必须非常小心地从 Java 调用它。通常,C 库的实现没有考虑到线程安全。

  • 如果您的 C 库存在内存管理问题,它可能会破坏 Java 平台的稳定性,从而导致 JVM 崩溃。

  • 立即调用本机库意味着您的应用程序更难移植,并且需要更复杂的构建过程。

于 2010-01-18T02:52:17.340 回答
3

是的,您为此目的使用 Java 本机接口 ( JNI ) 从 Java 调用 C/C++。

您也可以为此目的使用SWIG :

于 2010-01-17T19:22:29.730 回答
1

查看JNI(Java 本机接口)。

于 2010-01-17T19:20:00.437 回答
1

是的。正如其他人已经提到的,JNI 或 Java Native Interface 是 Sun 的首选方式。如果您觉得需要从其他语言以及 Java 调用 C 代码,我会研究SWIG,它将透明地为您生成 JNI 代码,但也允许您执行类似的操作,例如, Python。

于 2010-01-17T19:25:44.417 回答
0

有许多C 到 (Java) 字节码编译器,它们可以将您的 C 代码转换为可直接从 Java 调用的可移植 Java 类的 .jar。

与 JNI 的缺点:

  • 存在明显的性能损失,通常至少为 100%。

与 JNI 相比的优势:

  • 就像运行纯 Java 代码一样,它是安全的,不需要特殊权限即可加载,也不需要为每个目标平台重新编译。

(当我说“ JNI ”时,我的意思是所有 Java 接口到本机代码。例如,这同样适用于CNI。)

于 2010-01-18T03:07:22.997 回答