在Java应用程序中使用C源代码的最简单方法是什么?

时间:2008-09-17 13:38:10

标签: java c translation

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

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


修改

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

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

7 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:5)

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

是否没有JAVA等效数学函数?

当你自己评论JNI的方式是可能的,对于你可能使用'Bloodshead Dev-c ++'的c编译器可能会起作用,但是对于5000行来说需要付出很多努力。

答案 2 :(得分:4)

我编译它并使用JNA。

JNA(Java Native Access)基本上是在运行时运行什么JNI在编译时并且不需要任何非java代码(也不是很多java)。

我不了解你的表现或可用性,但我会试一试。

答案 3 :(得分:1)

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

一旦64位变得更常见,您还需要开始构建/部署该库的32位和64位版本。根据C代码的含义,您可能需要或不需要更新代码以使其构建为64位。

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

答案 4 :(得分:0)

事实上,JNA看起来令人印象深刻,它比直接使用JNI需要更少的努力。但无论如何你都会失去平台独立性,因为你可能只使用了它的一小部分,你可以考虑翻译你真正需要的东西。

答案 5 :(得分:0)

嗯,有AMPC。它是适用于Windows,MacOS X和Linux的C编译器,可以将C代码编译为Java Byte Code(在Java虚拟机上运行的代码类型)。

AMPC

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

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

使用JNI会使代码平台依赖,但是如果你说它是独立于平台的C,那么你的Java代码就没有理由依赖于平台。 OTOH,取决于这些计算的成本,使用JNI实际上可能会为您带来性能提升,因为在原始数字运算吞吐量方面,C仍然可以在速度上超过Java。然而,JNI调用非常昂贵,因此如果计算只是一个非常简单,快速的计算,那么JNI调用本身可能需要比执行的计算同样长(甚至更长),在这种情况下使用JNI将不会为您买任何东西,但会减慢关闭你的应用程序并导致内存开销。

答案 6 :(得分:-2)

您是否尝试过使用:

System.loadLibrary("mylibrary.dll");

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