9

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

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


编辑

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

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

4

7 回答 7

11

Java GNU Scientific Library项目中,我使用Swig围绕 C 库生成 JNI 包装类。很棒的工具,还可以生成包括 Python 在内的多种语言的包装器代码。强烈推荐。

于 2008-09-17T13:43:54.713 回答
5

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

没有 JAVA 等效的数学函数吗?

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

于 2008-09-17T13:42:52.233 回答
4

我会编译它并使用JNA。

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

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

于 2008-09-17T13:43:14.933 回答
1

你确定要使用 C 库,即使它很小?

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

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

于 2008-09-17T16:54:13.757 回答
0

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

于 2008-09-17T13:48:51.003 回答
0

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

AMPC

但是,它是商业的,每个许可证的成本为 199 美元。我怀疑这会给你带来回报;)我不知道有任何这样的免费编译器。

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

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

于 2008-09-17T13:54:14.703 回答
-2

您是否尝试过使用:

System.loadLibrary("mylibrary.dll");

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

于 2008-09-17T13:46:39.167 回答