3

背景:我们正在设计一个物理应用程序,它将进行大量数据分析,但我们的重点是集成物理电子设备。

基本上我希望能够从 Java 调用用 C++ 库编写的root (它是 CERN 用 C++ 编写的大数据分析库)库。基本上能够从 Java 中使用 ROOT 类(并且在不浪费太多时间编写 JNI 包装器的情况下这样做)对我们来说是一个很好的展示(如果这很难,我们很可能会使用 Qt)。

我可以想到以下方法

  • JNI - 正如我所说 - 我们不想为每个类编写包装器。. .
  • JNA - JNA 不提供 C++ 映射,而仅提供 C.
  • SWIG - 我没用过,但听说很难用。

其他可能相关的事情:我们可以访问根源代码,但我们不想更改它。我们希望结果是可移植的。我们想坚持免费图书馆。正如我所说 - 我们可以从一开始就使用大部分 ROOT 代码,而无需大惊小怪。

4

9 回答 9

6

编写一个小型 C++ 应用程序,它从标准输入读取您的输入并将输出写入标准输出。然后从您的 java 应用程序中运行该过程并从标准输出读取输出。

这是没有 JNI 的最佳方法(而且很容易做到)

于 2009-10-08T01:23:49.893 回答
3

有任何选择,你都需要做一些包装。虽然您不想为每个类编写 JNI 包装器,但您可以编写包含方法组的更高级别的 C++ 类。然后您只需要为更高级别的类编写包装器(这种方法也适用于其他方法,而不仅仅是 JNI)。

于 2009-10-07T23:41:44.540 回答
2

我会推荐Dropbox 的 djinni 界面生成工具。他们将它用于他们的跨平台移动应用程序,以生成 Java (Android) 和 Objective-C (iOS) 接口及其 C++ 数据模型之间的接口。

Facebook 也将它用于他们的一个应用程序。所以我认为,它经过了很好的测试。

查看他们在 CppCon上的演讲,了解它的作用。使用 JNI 在 Java 和 C++ 之间进行接口似乎特别容易出错。

于 2015-08-24T11:08:54.417 回答
1

JNIEasy支持将 C++ 类映射到 Java POJO 类,但成本为 399 欧元。由于您更喜欢免费库,因此您可能希望寻找使用 CORBA 之类的解决方案。这是将 C++ 类映射到 Java 类的唯一方法。

编辑:您是否考虑过 JAS3,它是一个类似于 root 的 java 库?

于 2009-10-08T04:10:44.307 回答
0

只是一个想法,但你可以使用 Python,因为 Root 已经支持它吗?您很可能会相当精通为 Java 包装代码所需的时间。

于 2009-10-07T23:44:30.120 回答
0

考虑使用 C# 而不是 Java。如果您已经熟悉 java,那么切换到 C# 很容易,并且它对调用本机代码有更好的支持

于 2009-10-07T23:55:34.863 回答
0

每当您通过 JNI 或等效程序从 Java 调用 C 或 C++ 代码时,由于 C/C++ 端的内存管理和/或线程安全问题,您面临着破坏 Java 平台稳定性的风险。

在走 JNI 等路线之前,我认为您应该考虑其他替代方案:

  • 将 Java 排除在外,完全用 C++(或其他人建议的 C++/CC#)实现。
  • 创建一个 C++ 命令行应用程序,该应用程序使用本机库执行您需要执行的任务,并使用其中一种java.lang.Runtime.exec方法运行该应用程序。
  • 在 C++ 中为库创建一个“服务器”包装器,将您需要的功能作为自定义协议公开,并编写 Java 端以使用 HTTP、原始套接字、管道或任何适当的传输级别与服务器通信。

替代方案都有缺点,但 JNI / JNA 等也有缺点;见第一段。

编辑:当您决定在系统中使用 JNI / JNA 时,可能会产生长期后果。除了稳定性问题,还要考虑可移植性(原生库能否在 Windows、Linux 等上运行)、构建问题(在 Ant 中构建原生库很难等)、平台版本问题(将升级到 Java 7 破坏什么?),开发人员技能(JNI 集成的“Joe”已经离开——还有谁知道 Java、C++ 和 JNI?)。这些问题的总和(IMO)比进行初始开发所需的时间更重要。

于 2009-10-08T00:14:25.953 回答
0

在 C++ 中编写您需要的类/函数、编译并从 java 调用 exec() 怎么样?

于 2009-10-08T00:20:40.330 回答
0

如果很难,我们很可能会使用 Qt

你为什么不专注于此?到目前为止,您还没有提到应该首选 Java 的任何原因。

如果最大的部分是ROOT源代码和调用它的代码,那么在 C++ 中完成这一切可能会快得多。
因为你对 Qt 没问题,所以 UI 不应该太担心。

编辑:
我真的看不出Java方法有什么好处——无论如何你必须将大部分源代码移植到其他平台,你增加了包装层的复杂性并且你有更多的依赖关系。

于 2009-10-08T00:22:03.167 回答