java模块可以调用交流模块吗?

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

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

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

在赞成方面:

  • 从Java调用C库将避免使用Java重新编码库(但见下文)。

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

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

在另一方面:

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

  • 如果您的C库不是线程安全的,那么您必须非常小心地从Java调用它。 作为一项规则,C库在实现时并未考虑线程安全性。

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

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

是的,您可以使用Java Native Interface( JNI )从Java中调用C / C ++。

  • Java Native Interface:程序员指南和规范

您也可以将SWIG用于此目的:

  • SWIG教程

查看JNI(Java Native Interface)。

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

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

损害与JNI:

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

与JNI相比的好处:

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

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