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 。)