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

标签 java c++ java-native-interface libraries jniwrapper

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

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

我特别想知道的事情:

  1. Java 库中的每个 Java 类是否应该映射到关联的 C++ 类(class)? IE。在我的 C++ 库中,我会有一个类,每个类调用一个 特定 Java 类的 JVM?还是我会有一个单一的 JVM,通过它可以访问所有内容?执行此操作的最佳方法是什么?为什么?
  2. 执行此操作的基本流程和架构是什么?
  3. 是否有使用调用 API 从 Java 库创建 C++ 库的特定资源?

非常感谢!

最佳答案

我以前做过这个,但不适合胆小的人,尤其是当您在两种语言之间的界面很困难时。在这种情况下调试也很痛苦。

回答你的观点:

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

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

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

另一种选择(可能可行也可能不可行,具体取决于您的库和用例)是围绕您的库编写某种包装服务,实际上是用 Java。然后通过 JSON-HTTP 或一些消息系统向它发送请求。

一个更多的选择,用 C++ 重写库正在做的任何事情。

关于java - 使用 C++ (JNI) 包装 Java 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52807336/

相关文章:

c++ - C++程序的输出

c++ - WINAPI 消息循环让我抓狂

java - jFieldId int 对对象无效

java - java 中的函数式编程和有用的编译器错误

java - 当Java中的谐波级数达到指定目标时,如何停止对其求和?

Java集合规定

java - 如何声明返回泛型类的方法?

c++ - 左边的右值

c++ - 函数指针和 lambda 的内存管理

android - ndk-build 错误 prebuilt-library.mk :28: *** missing separator. 停止