是否有可用于从C ++移植到Java的工具/软件

时间:2011-01-21 10:38:42

标签: java c++

您好我们有一个用C ++编写的项目/产品。现在我们计划将其转换为Java以获得Java的好处。

是否有可用于此移植的工具?什么是最好的开始方式?

3 个答案:

答案 0 :(得分:2)

我已经看到了一些自动代码转换的尝试,虽然它在技术上可以“工作”,但生成的代码通常是完全不可维护的。主要问题是:

  • 有些概念不能干净地翻译,并且需要一些非常混乱(通常很慢!)的解释或包装来获得相同的结果。
  • 优秀的Java代码的结构和样式与优秀的C / C ++代码截然不同。如果您自动翻译代码,您将最终得到目标语言非常单一的结构和样式,并且随后很难理解/维护。
  • 根本无法翻译某些代码(例如,C / C ++中的某些更神秘的内存管理代码根本无法在Java内存模型中完成)。这将打破任何自动翻译,需要完全重写。

因此,我建议使用分段转换,而不是尝试使用工具转换整个产品。例如,您可以采用以下方法

  • 首先创建一个Java应用程序(或Web应用程序)作为C / C ++代码的“包装器”。此时可以只是一个简单的界面。
  • 弄清楚如何做Java< - >电话(提示:JNI
  • 使用JNI将C / C ++代码称为黑盒“引擎”。
  • 编写大量JUnit测试,检查您是否获得了预期的结果。这不仅是一般的良好做法,而且在您进行未来转换步骤时可以大大帮助您避免错误。
  • 随着时间的推移,将C / C ++的组件转换为Java。通过调用某些Java代码替换对这些组件的每个JNI调用,这可能会根据需要对剩余的C / C ++代码库进行低级JNI调用
  • 使用每个翻译步骤作为重构代码的机会。定义清晰的基于服务的界面,减少重复,使事物不可变等。

答案 1 :(得分:0)

Swig不会从C ++移植到java per-se,但它会自动为现有类型层次结构生成包装器,因此您可以用Java调用(和扩展)C ++代码。根据您要实现的目标,这可能非常有用且非常简单,例如,它允许您从新的Java代码库访问遗留代码。

答案 2 :(得分:0)

您希望将其转换为Java,然后您放弃了可移植性和性能,但这是您的决定;)

但是我不认为这是可能的,因为这两种语言之间存在根本区别。例如,在C ++中,可以在堆或堆栈上分配对象,在Java中,您只能在堆栈中放置“原始类型”,如int和float;对象使用由垃圾收集器管理的堆。 Java也提供了更大的标准库,因此STL代码(如果使用STL)也必须移植到那个...