用C+包装Java库+;(JNI) 我有一个C++程序,需要使用一个特定的java库。理想的是,我想创建一个等价的C++库来封装现有的java代码。因此,我一直在研究JNI调用API

用C+包装Java库+;(JNI) 我有一个C++程序,需要使用一个特定的java库。理想的是,我想创建一个等价的C++库来封装现有的java代码。因此,我一直在研究JNI调用API,java,c++,java-native-interface,libraries,jniwrapper,Java,C++,Java Native Interface,Libraries,Jniwrapper,由于我不是一个经验丰富的程序员,而且我对JNI和多语言编程也缺乏经验,因此我非常希望能得到一些关于如何解决这个问题的一般性的指导/提示/建议 我特别想知道的事情: 是否应该将java LIB映射中的每个java类都转换为关联C++ 上课?也就是说,在我的C++库中,我会有一个类,每个调用 特定Java类的JVM?或者我将拥有一个单一的JVM,通过它可以访问所有内容?最好的方法是什么?为什么 这样做的基本过程和架构是什么 使用调用API?< /LI>有没有用于从java LIB创建C++ LIB的

由于我不是一个经验丰富的程序员,而且我对JNI和多语言编程也缺乏经验,因此我非常希望能得到一些关于如何解决这个问题的一般性的指导/提示/建议

我特别想知道的事情:

  • 是否应该将java LIB映射中的每个java类都转换为关联C++ 上课?也就是说,在我的C++库中,我会有一个类,每个调用 特定Java类的JVM?或者我将拥有一个单一的JVM,通过它可以访问所有内容?最好的方法是什么?为什么
  • 这样做的基本过程和架构是什么
  • 使用调用API?< /LI>有没有用于从java LIB创建C++ LIB的特定资源?
    非常感谢

    我以前做过,但这不是为胆小的人准备的,尤其是当两种语言之间的接口很难实现时。在这种情况下,调试也是一件痛苦的事情

    要回答您的观点:

    >P>你应该从决定你需要在C++程序中访问java库的功能开始。这只是一些任务吗?在这种情况下,尝试从C++到爪哇做一个简单的接口。复杂吗?然后你必须开始把java类映射到C++,你需要的越多,工作量就越多。

  • 第一季度末实际上是第二季度。您的C++程序将启动一个JVM,它将作为程序的一部分运行。当您跨C++调用数据时,将被传递到JVM,然后执行java代码,然后返回返回的值。这会导致性能成本,因此通过JNI调用小函数如“代码>添加(int,int)< /代码>将比在C++中做更昂贵。

  • 有很多基本的指南,你可以通过谷歌开始。仅仅从C++开始管理一个基本的JVM并进行一个调用实际上是一个工作,因为你需要得到JVM LIBS的正确路径或者它不起作用(除非他们改进了这个,我试了几年)。因此,在询问关于JNI和映射函数的更具体问题之前,您可能想先检查一下

  • 另一种选择(根据您的库和用例的不同,这可能是可能的,也可能是不可能的)是在库周围编写某种包装器服务,实际上是用Java编写的。然后通过JSON-HTTP或某种消息传递系统向其发送请求

    < C++ > C++ C++ JNI库,可以生成任何C++代码的C++标题,然后轻松访问C++的java java代码。以下是一份:

    #包括
    #包括
    #包括
    使用名称空间scapix::link::java;
    使用名称空间scapix::java_api;
    void test1()
    {
    //C++对象自动转换为相应的java类型。
    //这适用于scapix::link::java::convert()接口支持的任何类型,
    //它支持许多STL类型,并且可以为您自己的类型进行扩展。
    std::string version=java::lang::System::getProperty(“java.version”);
    std::vector languages=java::util::Locale::GetIsolagues();
    std::vector zone_strings=java::text::DateFormatSymbols::getInstance()->getZoneStrings();
    std::map properties=java::lang::System::getProperties();
    }
    
    太好了,谢谢你。在我的例子中,我只对运行Java库中的一些方法感兴趣,但是,这些方法需要从库中的许多不同类创建许多对象。我已经和JNI玩过了,遇到了同样的问题!虽然我确实设法得到一个JVM并运行在最后:谢谢你的建议-多考虑!