首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用C++包装Java库(JNI)

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

Stack Overflow用户
提问于 2018-10-15 05:39:21
回答 2查看 1.2K关注 0票数 1

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

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

我特别想知道的事情:

  1. 是否应该将Java lib中的每个Java类映射到一个关联的C++类?也就是说,在我的C++库中,我会有一个类,每个类都为一个特定的Java类调用一个JVM吗?或者我会有一个单独的JVM,通过它可以访问所有东西?执行此操作的最佳方法是什么?为什么?
  2. 执行此操作的基本过程和体系结构是什么?
  3. 是否有任何特定资源可用于使用调用API从Java lib创建C++库?

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-15 06:06:32

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

要回答你的观点:

  1. 您应该首先确定您需要在C++程序中访问Java库中的哪些功能。仅仅是几个任务吗?在本例中,尝试创建一个从C++到Java的非常简单的接口。这很复杂吗?然后你必须开始将Java类映射到C++,你需要的东西越多,它的工作量就越大,
  2. q1的末尾真的有点像q2。您的C++程序将启动一个单独的JVM,该虚拟机将作为程序的一部分运行。当您跨C++进行调用时,数据将被传输到JVM中,然后执行Java代码,然后传回返回值。这会带来性能成本,所以通过JNI调用像add(int,int)这样的小函数比在C++中调用要昂贵得多。
  3. 你可以在谷歌上搜索到很多基本的指南来开始。仅仅是设法从C++启动一个基本的JVM并进行一个调用实际上是一项很大的工作,因为您需要确保到JVM库的路径是正确的,否则它就不能工作(除非他们已经改进了这一点,因为我已经多年没有尝试过了)。因此,在询问有关JNI和映射函数的更多具体问题之前,您可能需要先检查一下。

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

另一种更好的选择是重写库在C++中所做的任何事情。

票数 1
EN

Stack Overflow用户

发布于 2019-03-14 02:32:14

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

代码语言:javascript
复制
#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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52807336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档