可行性评估:ofdrw (Java) → C++20 Static Lib

一、项目规模概览

指标数值
Java 源文件683 个
总代码行数~91,217 行
Maven 模块13 个
Java 版本1.8
授权协议Apache 2.0

二、模块明细

模块文件数代码行复杂度核心功能
ofdrw-core26124,721⚠️ 极高OFD 数据结构、XML DOM 抽象层、类型系统
ofdrw-layout11421,682OFD 布局引擎
ofdrw-converter7915,898OFD→PDF/图片/SVG/HTML 格式转换
ofdrw-gm626,877中高国密 SM2/SM3/SM4 算法 + ASN.1 结构
ofdrw-reader365,899OFD 文档解析
ofdrw-sign595,216数字签章
ofdrw-pkg293,670OFD 打包/解包 (ZIP)
ofdrw-graphics2d113,667AWT Graphics2D 桥接
ofdrw-crypto161,573中低加密支持 (GMT 0099)
ofdrw-tool101,400文档合并裁剪工具
ofdrw-font4588字体处理
其他226极低gv(全局变量), full(整合包)

三、技术依赖分析

Java 依赖C++20 替代方案迁移难度
dom4j (XML DOM)pugixml / libxml2⚠️ — core 架构层深度绑定,整个DefaultElementProxy 体系需要重新设计
BouncyCastle (密码)OpenSSL / GmSSL⚠️ — 国密 SM2/3/4 算法在 C++ 侧需要专门的库支持
AWT (Graphics2D, Font, Color, BufferedImage)cairo / Skia / AGG⚠️ ofdrw-graphics2dofdrw-converter 依赖深
Java NIO/IO (Path, Zip streams)std::filesystem +中等
miniz/zlib Apache commons-io自行实现
Twelvemonkeys imageio-tifflibtiff

四、Java → C++20 核心语义转换挑战

Java 特性C++20 对应方案难度
接口 (interface)纯虚类 / concept中等
泛型 (generics)template中等
Lambda/Streamstd::ranges / lambda中等
反射 (reflection)C++ 没有反射 — 需手动重构
GC / try-with-resourcesRAII / unique_ptr中等
注解 (@Deprecated等)[[deprecated]] attribute
序列化 (Serializable)需要手动实现中等
动态类加载不可用需替代方案

五、可行性结论

✅ 技术可行,但存在重大约束

推荐方案:分阶段、按模块手动重写

方案预估工作量说明
方案 A:全量移植6~12人月约 91K 行 Java → C++,含所有模块。属于大型工程
方案 B:核心子集 (core + pkg + layout)3~5 人月仅支持 OFD 文档生成,跳过 converter/ sign/ crypto
方案 C:JNI 桥接 (即用原 Java 库)1~2 周用 C++ 通过 JNI 调用原 Java 库,无需移植代码

❌ 不建议全量自动转换

现有 Java → C++ 转换工具(如 j2c、手动脚本)对这类重度依赖 Java 生态(dom4j、AWT、BouncyCastle) 的项目失效率达 80%
以上,输出不可维护。


请问您期望的使用场景是什么? 这将帮助我确定最佳方案:

  • 如果你只需要 生成/读取 OFD 文档,建议走 方案 B(核心子集)
  • 如果你需要 OFD 签章/国密/格式转换,建议走 方案 A(全量移植) 或考虑 方案 C(JNI 桥接)
  • 如果你能接受 混合方案,也可以先移植核心模块,其他模块后续补上