1

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

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

我特别想知道的事情:

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

非常感谢!

4

2 回答 2

1

我以前做过这个,但它不适合胆小的人,特别是如果你在两种语言之间的界面很难。在这种情况下,调试也很痛苦。

回答你的观点:

  1. 您应该首先决定您需要在 C++ 程序中访问 Java 库中的哪些功能。只是几个任务吗?在这种情况下,尝试制作一个从 C++ 到 Java 的非常简单的接口。复杂吗?然后你将不得不开始将 Java 类映射到 C++,你需要的越多,工作就越多。

  2. q1 的结尾确实是 q2。您的 C++ 程序将启动一个 JVM,该 JVM 将作为您程序的一部分运行。当您跨 C++ 进行调用时,数据将被传输到 JVM,然后执行 Java 代码,然后将返回值传回。add(int,int)这会产生性能成本,因此通过 JNI调用小函数会比仅在 C++ 中调用更昂贵。

  3. 您可以通过 Google 搜索很多基本指南来开始使用。仅仅设法从 C++ 启动一个基本的 JVM 并进行调用实际上是一项工作,因为您需要正确获取 JVM 库的路径或者它不起作用(除非他们已经改进了这一点,自从我试过)。因此,在询问有关 JNI 和映射函数的更具体问题之前,您可能需要先检查一下。

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

一个甚至更多的替代选项,重写库在 C++ 中所做的任何事情。

于 2018-10-14T22:06:32.120 回答
0

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

#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();
}
于 2019-03-13T18:32:13.573 回答