使用大量C++;来自Java的代码

使用大量C++;来自Java的代码,java,c++,interop,root-framework,Java,C++,Interop,Root Framework,背景:我们正在设计一个物理应用程序,它将进行大量的数据分析,但我们的重点是集成物理电子设备 基本上我希望能够调用(它是C++ C++编写的CERN大数据分析库),用java编写的C++库。基本上,使用Java中的根类(并且在不浪费太多时间编写JNI包装器的情况下)的能力对我们来说是一个障碍(如果很难,我们很可能会使用Qt) 我可以想出以下方法 JNI-正如我所说的-我们不想为每个类编写包装器 不提供C++映射,但仅提供c/< -我没用,但听说很难用 其他可能相关的事情:我们可以访问根源代码,

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

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

我可以想出以下方法

  • JNI-正如我所说的-我们不想为每个类编写包装器 不提供C++映射,但仅提供c/<
  • -我没用,但听说很难用
其他可能相关的事情:我们可以访问根源代码,但我们不想更改它。我们希望结果是可移植的。我们希望坚持免费图书馆。
正如我所说的,我们将能够从一开始就使用大部分根代码,而不必大惊小怪

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

这只是一个想法,但是您可以使用Python,因为Root已经支持它了吗?您很可能会在编写Java代码所需的时间内变得相当熟练。

考虑使用C#而不是Java。java java java语言,如果你已经熟悉Java,那么切换到C语言很容易,它也有调用本地代码的能力。

每当你通过JNI或等价物调用Java中的C或C++代码时,你就可能会因为Java C/C++的内存管理和/或线程安全问题而破坏Java平台的安全性。 <>在走JNI等路线之前,我认为你应该考虑其他选择:

  • 将java从方程中取出,并完全用C++实现(或C++或CC/x,正如其他人建议的)。
  • 创建一个C++命令行应用程序,该应用程序使用本地库执行所需的任务,并使用<代码> java .Lang.RunTime.Exc> <代码>方法运行应用程序。
  • 在C++中创建一个“服务器”包装器,用于将需要作为自定义协议的功能暴露出来,并使用HTTP、原始套接字、管道或任何传输级别对java端进行代码化。
备选方案都有缺点,但JNI/JNA等也有缺点;见第一段


编辑:当您决定在系统中使用JNI/JNA时,可能会产生长期的后果。除了稳定性问题,您还必须考虑可移植性(本地库是否在Windows、Linux等上工作)、构建问题(很难在ANT等中构建本机库)、平台版本问题(将升级到java 7断开什么东西)、开发技巧(乔)。JNI集成是谁留下的——谁还知道java、C++和JNI?这些问题的总和比IMO的初始开发需要的时间要重要得多。

< P>在Java中编写C++所需的类/函数、编译和调用Excor(?)java?

< p> 你为什么不把重点放在这上面?到目前为止,您还没有提到为什么应该首选Java

如果最大的部分是根源和调用它的代码,那么在C++中,你可能要做得更快。 由于您对Qt没有问题,因此用户界面不必太担心

编辑:

我不能真正地看到java方法的任何优点——不管怎样,你必须把一大部分的源移植到其他平台上,你在包层增加了复杂性,并且有了更多的依赖关系。

< p>编写一个C++应用程序,它从STDIN中读取输入,并将输出写入STDUT。然后从java应用程序中运行该进程,并从stdout读取输出

<>这是最好的方法,没有JNI(并且很容易做到)

< P>支持C++类到java POJO类的映射,但是它花费了399欧元。因为您更喜欢免费库,所以可能需要寻找使用CORBA之类的解决方案。这是将C++类映射到java类的唯一方法。 编辑:您是否考虑过,它是一个类似于root的java库?

我推荐。他们使用它为跨平台的移动应用程序生成java(Android)和ObjtoVeC(IOS)接口及其C++数据模型之间的接口。p> 他们的一个应用程序。所以我想,它经过了很好的测试


有关其功能的概述。使用JNI来连接java和C++似乎特别容易出错。p> 当我在ubunturepo中发现python根绑定时,我想到了这一点。如果我可以选择——Qt或Python,我将选择Python。但我会坚持使用java(也许在一些小项目中学习python)。有一些C接口,它需要并返回数组并封装许多C++调用(并创建/销毁对象)。为什么它需要C而不是C++?我真的讨厌编写C/C++代码,如果我使用C接口,我就可以使用JNA连接到C LIB(并且使用JNA意味着没有C代码:))C是不是不可知的平台。我们选择Java是因为其他一些特性(除了我们有一些Java专家;)例如,我们喜欢动态链接(它允许我们以非常简单的方式包含插件)。Mono是C#编译器和.NET框架的跨平台实现。另外,C#特性是java的超集(除了选中的异常)。C#中的插件架构与java下的插件架构(定义插件接口,通过反射加载和实例化插件)一样有效。kno,您能详细说明线程安全问题吗