我有一个用C ++编写的大型程序,需要使用特定的Java库。理想情况下,我想创建一个包含此现有Java代码的等效C ++库。因此我一直在研究JNI调用API。
由于我不是一个非常有经验的程序员,而且我对JNI和多语言编程也缺乏经验,所以我非常感谢有关如何解决这个问题的一般指示/提示/建议。
我特别想知道的事情:
非常感谢!
我以前做过这个,但是如果两种语言之间的界面很难,那就不是胆小了。在这种情况下调试也可能是一种痛苦。
回答你的观点:
add(int,int)
这样的小函数会比在C ++中执行它更昂贵。另一种选择(根据您的库和用例可能会或可能不可能)只是在您的库周围编写某种包装器服务,实际上是在Java中。然后通过JSON-HTTP或某些消息传递系统向它发送请求。
一个更加可选的选项,重写库在C ++中所做的任何事情。
您可以使用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();
}