只是出于兴趣,是否可以从 java 模块调用 C 模块?如果是这样,该怎么做?
6 回答
是的,您可以使用Java Native Interface来执行此操作:
是的,你可以做到。你是否应该这样做是另一回事。
在专业方面:
从 Java 调用 C 库将避免在 Java 中重新编码库的需要(但见下文)。
对于某些计算密集型算法,编写良好的 C 实现可能比编写良好的 Java 版本更快。
某些操作系统特定的操作无法在纯 Java 中实现。
不利的一面:
与简单的 Java 方法调用相比,进行 JNI 调用的开销更大。
如果你的 C 库不是线程安全的,你必须非常小心地从 Java 调用它。通常,C 库的实现没有考虑到线程安全。
如果您的 C 库存在内存管理问题,它可能会破坏 Java 平台的稳定性,从而导致 JVM 崩溃。
立即调用本机库意味着您的应用程序更难移植,并且需要更复杂的构建过程。
是的。正如其他人已经提到的,JNI 或 Java Native Interface 是 Sun 的首选方式。如果您觉得需要从其他语言以及 Java 调用 C 代码,我会研究SWIG,它将透明地为您生成 JNI 代码,但也允许您执行类似的操作,例如, Python。
有许多C 到 (Java) 字节码编译器,它们可以将您的 C 代码转换为可直接从 Java 调用的可移植 Java 类的 .jar。
与 JNI 的缺点:
- 存在明显的性能损失,通常至少为 100%。
与 JNI 相比的优势:
- 就像运行纯 Java 代码一样,它是安全的,不需要特殊权限即可加载,也不需要为每个目标平台重新编译。