我找到了这个开源库,我想在我的 Java 应用程序中使用它。该库是用 C 编写的,是在 Unix/Linux 下开发的,我的应用程序将在 Windows 上运行。它是一个主要包含数学函数的库,据我所知它不使用任何依赖于平台的东西,它只是非常基本的 C 代码。而且,它也不是那么大,不到 5000 行。

在我的应用程序中使用该库的最简单方法是什么?我知道有 JNI,但这涉及到找到一个编译器来编译 Windows 下的库、了解最新的 JNI 框架、编写代码等。可行,但没那么容易。有更容易的方法吗?考虑到该库的规模较小,我很想将其翻译为 Java。有什么工具可以帮助解决这个问题吗?


编辑

我最终将库中我需要的部分翻译成 Java。到目前为止,它大约占库的 10%,尽管它可能会随着时间的推移而增加。C 和 Java 非常相似,所以只花了几个小时。主要困难是修复因翻译错误而引入的错误。

感谢大家的帮助。所提出的解决方案似乎都很有趣,当我需要链接到更大的库时我会研究它们。对于一小段C代码,手动翻译是最简单的解决方案。

有帮助吗?

解决方案

你最好的选择可能是买一本好的 c 书(K&R:C 编程语言)喝杯茶,开始翻译!我对信任翻译程序持怀疑态度,通常最好的翻译不是你自己!如果你做到了这一点,那么它就完成了,你不需要继续重做。如果该库是开源的,可能会出现一些复杂情况,您需要仔细检查许可证。另一点需要考虑的是,翻译中总会存在一些风险和潜在错误,因此可能有必要考虑编写一些测试以确保翻译正确。

JAVA没有类似的数学函数吗?

正如您自己评论的那样,JNI 方式是可能的,对于 C 编译器,您可能可以使用“Bloodshead Dev-c++”可能会工作,但对于大约 5000 行来说需要付出很大的努力。

其他提示

Java GNU 科学图书馆 我使用的项目 痛饮 围绕 C 库生成 JNI 包装器类。很棒的工具,还可以生成包括 Python 在内的多种语言的包装器代码。强烈推荐。

我会编译它并使用 JNA。

JNA(Java Native Access)基本上在运行时执行JNI在编译时的操作,并且不需要任何非java代码(也不需要太多java)。

我不知道它的性能或可用性在你的情况下,但我会尝试一下。

您确定要使用 C 库吗?即使它那么小?

一旦 64 位变得更加普遍,您还需要开始构建/部署 32 位和 64 位版本的库。根据 C 代码的情况,您可能需要也可能不需要更新代码以使其构建为 64 位。

如果 C 库很简单,那么将 C 库移植到纯 java 可能会更容易,而不必处理构建/部署 JNI 库、C 库和 java 代码。

嗯,还有 AMPC。它是一个适用于 Windows、MacOS X 和 Linux 的 C 编译器,可以将 C 代码编译为 Java 字节代码(运行在 Java 虚拟机上的代码)。

AMPPC

然而,它是商业性的,每个许可证的费用为 199 美元。我怀疑这对你有好处;)我不知道有任何这样的免费编译器。

OTOH、Java 和 C 非常相似。您可能可以将 C 代码重构为 Java(结构可以替换为具有公共实例变量的对象),并且指针操作通常可以转换为其他内容(例如数组操作)。虽然我猜您不想编写 5,000 行代码,是吗?

使用JNI使得代码依赖于平台,但是如果你说它是平台无关的C,那么你的Java代码就没有理由应该依赖于平台。OTOH,根据这些计算的成本,使用 JNI 实际上可能会带来性能提升,因为当涉及到原始数字处理吞吐量时,C 仍然可以在速度上击败 Java。然而,JNI 调用的成本非常高,因此,如果计算只是一个非常简单、快速的计算,那么 JNI 调用本身可能需要与执行的计算同样长(甚至更长)的时间,在这种情况下,使用 JNI 不会给你带来任何好处,反而会减慢速度关闭您的应用程序并导致内存开销。

确实,JNA 看起来令人印象深刻,它比直接使用 JNI 需要更少的精力。但无论如何,您都会失去平台独立性,并且由于您可能只使用其中的一小部分,因此您可能会考虑翻译您实际需要的内容。

您是否尝试过使用:

System.loadLibrary("mylibrary.dll");

不确定这是否适用于纯 C 库,但可能值得一试。:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top