gpt4 book ai didi

java - 寻找一种从 C++ 调用 Java 的便捷方式

转载 作者:IT老高 更新时间:2023-10-28 21:08:50 25 4
gpt4 key购买 nike

似乎大多数与 JNI(Java native 接口(interface))相关的文档或帮助程序库都与从 Java 调用 native 代码有关。这似乎是它的主要用途,尽管它的功能更多。

我主要想朝相反的方向工作:通过添加一些 Java 库来修改现有的(相当大的)可移植 C++ 程序。例如,我想让它通过 JDBC 调用数据库,或者通过 JMS 调用消息队列系统,或者发送电子邮件,或者调用我自己的 Java 类等。但是对于原始 JNI,这是非常不愉快且容易出错的。

因此,理想情况下,我希望编写可以像 C++/CLI 调用 CLR 类一样轻松调用 Java 类的 C++ 代码。比如:

using namespace java::util::regex; // namespaces mapped

Pattern p = Pattern.compile("[,\\s]+");

array<java::lang::String> result =
p.split("one,two, three four , five");

for (int i=0; i < result.length(); i++)
std::cout << result[i] << std::endl;

这样,我就不必 manually do the work of getting the method ID by passing the name and the weird signature strings , 并且可以避免因调用方法的未经检查的 API 引起的编程错误。事实上,它看起来很像等效的 Java。

注意。我仍在谈论使用 JNI! 作为一项底层技术,它非常适合我的需求。它是“进行中的”并且非常高效。我不想在单独的进程中运行 Java 并对它进行 RPC 调用。 JNI 本身很好。我只想要一个愉快的界面。

必须有一个代码生成工具来生成等效的 C++ 类、命名空间、方法等,以完全匹配我指定的一组 Java 类所公开的内容。生成的 C++ 类将:

  • 具有接受类似包装版本的参数的成员函数,然后执行必要的 JNI 巫术来进行调用。
  • 以相同的方式包装返回值,这样我就可以以自然的方式链接调用。
  • 维护每个类的方法 ID 静态缓存,以避免每次都查找它们。
  • 完全线程安全、可移植、开源。
  • 在每次方法调用后自动检查异常并产生一个标准 C++ 异常。
  • 当我以通常的 JNI 方式编写 native 方法但我需要调用其他 Java 代码时也可以使用。
  • 数组应该在原始类型和类之间完全一致。
  • 当引用需要在本地引用框架之外生存时,无疑需要像 global 这样的东西来包装引用 - 同样,所有数组/对象引用的工作方式都应该相同。

这样一个免费的、开源的、可移植的库/工具是否存在,还是我在做梦?

注意:我找到了 this existing question但在那种情况下,OP 并没有我对完美的要求那么高......

更新:关于 SWIG 的评论将我带到 this previous question ,这似乎表明它主要是关于相反的方向,所以不会做我想要的。

重要

  • 这是关于能够编写操作 Java 类和对象的 C++ 代码,而不是相反(见标题!)
  • 我已经知道 JNI 存在(请参阅问题!)但是 JNI API 的手写代码不必要地冗长、重复、容易出错、在编译时未进行类型检查等。如果你想缓存方法ID 和类对象更加冗长。我想自动生成 C++ 包装类来为我处理所有这些。

更新:我已经开始研究自己的解决方案:

https://github.com/danielearwicker/cppjvm

如果这已经存在,请告诉我!

注意。如果您正在考虑在自己的项目中使用它,请随意,但请记住,现在代码已经有几个小时了,到目前为止我只写了三个非常不费力的测试。

最佳答案

是的,现有的工具可以做到这一点——为 Java 类生成 C++ 包装器。这使得在 C++ 中使用 Java API 更加透明和愉快,成本和风险更低。

我用得最多的是JunC++ion .它成熟、强大且稳定。主要作者人很好, react 也很灵敏。不幸的是,它是一种商业产品,而且价格昂贵。

Jace是具有 BSD 许可证的免费开源工具。自从我上次和杰斯一起玩已经有好几年了。看起来还有一些积极的发展。 (我还记得十多年前原作者的 USENET 帖子,问的问题基本上和你问的一样。)

如果您需要支持从 Java 到 C++ 的回调,定义实现 Java 接口(interface)的 C++ 类会很有帮助。至少 JunC++ion 允许您将此类 C++ 类传递给接受回调的 Java 方法。我上次尝试 jace 时,它​​不支持这一点——但那是七年前的事了。

关于java - 寻找一种从 C++ 调用 Java 的便捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com