使用C ++(JNI)包装Java库

问题描述 投票:1回答:2

我有一个用C ++编写的大型程序,需要使用特定的Java库。理想情况下,我想创建一个包含此现有Java代码的等效C ++库。因此我一直在研究JNI调用API。

由于我不是一个非常有经验的程序员,而且我对JNI和多语言编程也缺乏经验,所以我非常感谢有关如何解决这个问题的一般指示/提示/建议。

我特别想知道的事情:

  1. Java lib中的每个Java类是否应该映射到关联的C ++类?即在我的C ++库中,我是否有一个类,每个类都为特定的Java类调用JVM?或者我将拥有一个单一的JVM,通过它可以访问所有内容?这样做的最佳方式是什么?为什么?
  2. 这样做的基本流程和架构是什么?
  3. 是否有使用调用API从Java lib创建C ++库的特定资源?

非常感谢!

java c++ java-native-interface libraries jniwrapper
2个回答
1
投票

我以前做过这个,但是如果两种语言之间的界面很难,那就不是胆小了。在这种情况下调试也可能是一种痛苦。

回答你的观点:

  1. 您应该首先确定您需要在C ++程序中访问Java库中的哪些功能。这只是一些任务吗?在这种情况下,尝试创建一个从C ++到Java的非常简单的接口。这很复杂吗?那么你将不得不开始将Java类映射到C ++,并且你需要的越多,它就会越多。
  2. q1的结尾真的是sorta q2。您的C ++程序将启动一个JVM,它将作为程序的一部分运行。当您跨C ++进行调用时,数据将被传输到JVM中,然后执行Java代码,然后将返回值传回。这会产生性能成本,因此通过JNI调用像add(int,int)这样的小函数会比在C ++中执行它更昂贵。
  3. Google可以为您提供许多基本指南。只是设法从C ++启动一个基本的JVM并进行调用实际上是一些工作,因为你需要让JVM库的路径正确或者它不起作用(除非他们改进了这个,所以我已经好几年了试过)。因此,在询问有关JNI和映射函数的更具体问题之前,您可能需要先检查一下。

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

一个更加可选的选项,重写库在C ++中所做的任何事情。


0
投票

您可以使用scapix::link::java C ++ JNI库为任何Java代码生成C ++标头,然后从C ++轻松访问此Java代码。这是一个example

#include <scapix/java_api/java/lang/System.h>
#include <scapix/java_api/java/util/Locale.h>
#include <scapix/java_api/java/text/DateFormatSymbols.h>

using namespace scapix::link::java;
using namespace scapix::java_api;

void test1()
{
    // C++ objects are automatically converted to and from corresponding Java types.
    // This works for any type supported by scapix::link::java::convert() interface,
    // which supports many STL types and can be extended for your own types.

    std::string version = java::lang::System::getProperty("java.version");
    std::vector<std::string> languages = java::util::Locale::getISOLanguages();
    std::vector<std::vector<std::string>> zone_strings = java::text::DateFormatSymbols::getInstance()->getZoneStrings();
    std::map<std::string, std::string> properties = java::lang::System::getProperties();
}
© www.soinside.com 2019 - 2024. All rights reserved.