我想您会发现使用 JNI 并不像在深入研究之前那样令人生畏。有一些重要的权衡和限制,但总的来说,JNI 运行良好,并且相当容易按照您的意图使用。
正如其他人所说,JNI 的最佳案例是:
- 复杂的本机代码(如果该代码已被证明非常可靠,则加分)
- Java 和本机代码之间的来回最小化(您希望最小化跨 JNI 层的行程)
- 对本机代码的相当简单的调用接口(或者如果您是本机代码需要利用 Java 对象/方法,也可以返回 Java)
对于一组结构合理的本地组件,自动化或伪自动化创建 JNI 层绝对是可能的。如果要包装的组件数量很大,那将是非常值得的。
JNI 的好消息是您应该可以直接构建和测试此接口,例如,您应该能够从 Java 编写利用现有算法行为的测试用例,如果存在问题,它们很可能出现在 JNI层本身而不是算法(鉴于您对本机实现的信心)。
用 Java 重写大量 C/C++ 算法对我来说似乎比使用 JNI 风险更大。当然,如果不知道细节就很难衡量,但我可以想象影响算法实际实现的技术之间存在细微的差异,更不用说纯粹的工程工作和出错的风险了。
最后一个考虑因素是这些算法或相关组件的未来寿命。这组算法或多或少是完整的,还是您继续添加?无论哪种方式,是否有强有力的维护和/或未来发展的理由来支持一种技术而不是另一种?例如,如果其他一切都在 Java 中,所有新算法都将在 Java 中,并且团队中的几乎每个人几乎总是在 Java 中编码,那么从长远来看,用 Java 重新实现开始看起来更具吸引力。
然而,即使这样说,工作胜过一致。对于大量运行良好的原生组件,即使您要长期过渡到 Java,我仍然倾向于从 JNI 开始。