用Java重写C代码还是使用JNI?

2022-09-02 14:16:31

我目前正在开发一个用Java编写的项目。我们有一堆用C / C++编写的算法(至少几百个),需要将其合并到我们的项目中。我们的两个选项是使用 JNI 调用此代码,或者重写 Java 中的所有算法。

我知道使用JNI的后果,它可能会带来一系列全新的问题,这就是为什么甚至考虑用Java重写所有代码的原因。但是重写它的想法似乎...错。据我所知,这些算法已经过测试并工作,它们只是用错了语言。

在这种情况下,JNI会让这项任务变得容易吗?或者它会比用Java重写代码更令人头疼吗?


编辑#1:相关问题 - JNI的有用性


编辑#2:仅供参考 - 我们的Java项目并不意味着以任何方式都是可移植的。这可能会消除JNI的一个缺点,因为它被认为降低了可移植性。


答案 1

简单的答案是,如果代码将被调用很多并且性能很重要,那么请将其转换为Java。

更复杂的答案是:

  • 如果库很容易用JNI包装,那么使用JNI
  • 如果您对C / C++代码的测试很容易转换为Java,那么请转到端口

我会做以下事情:

  • 采用其中一个算法并将其包装在JNI中
  • 采用相同的算法并将其转换为Java
  • 看看哪个更痛苦
  • 如果速度很重要,那么分析两个版本,看看哪个是可以接受的。

答案 2

我认为答案在于调用java代码和调用的C / C++代码之间的耦合程度以及重写所需的工作量。如果您的 C 代码采用几个整数,则执行一些毛茸茸的计算,并返回另一个 int。请使用 JNI。如果有很多复杂的来回,但算法相当简单,请重写它们。故障线是 JNI 连接。如果这很复杂,你最终可能会编写比重写算法代码更多的JNI接口代码。


推荐