2012-03-05 52 views
2

假设我有一个用Java编写的框架和一些执行资源密集型工作的C++代码。 - 框架根据数据库配置初始化一个处理链。处理单元(这个链)是用C++编写的。每个单元都实现了以下接口:按Java名称加载C++类

class IModule { 
public: 
    virtual ~IModule() {}; 
    virtual bool setConfig(ModConfig* config) = 0; 
    virtual map<string*,string*>* getStatus() = 0; 
}; 

我希望开发人员能够实现该接口IModule的在C++中,使包含类的名称的数据库条目。 Java框架然后自动加载该类。 - 目标不得是在C++和Java中都编写额外的绑定代码。 正如您在界面中看到的,setConfig()方法接收一个ModConfig类型的对象。这意味着必须能够在Java中创建该C++对象的实例。

我评价以下技术: - JNA:C仅 - >需要另外绑定代码 - JNIEasy:地图对象到对象直接 - SWIG:地图对象到对象直接 - BridJ:地图对象到对象直接 - JNI:可能是问题的解决方案?

摘要: - 从Java中按名称加载C++类。 - 在Java中实例化C++对象。

我不指望有人向我提供代码。请指出我正确的方向(技术)。

在此先感谢

+1

也许类似于[this](http://stackoverflow.com/questions/5577559/how-to-keep-a-c-object-inside-java-code-possible)问题? – 2012-03-05 09:27:19

+0

BridJ旨在促进Java的<-> C++的互操作。但它可能无法处理模板。 SWIG允许您配置并自动生成大量的JNI代码;如果你的API是有限的,那么用普通的JNI会更好。如果您可以将您的API简化为兼容C的呼叫,那么JNA或BridJ肯定会完成这项工作。 – technomage 2012-03-13 19:00:04

回答

1

你的问题进行了深入的操作系统特定的(或者我误会了吧)。我不明白在运行时加载C++类对您意味着什么(当然,在纯C++ 11中不可能,您需要操作系统支持)。

您可以在Posix系统上加载一个可动态链接的共享对象,并使用dlopen然后在dlsym中获得符号的地址。不要忘记声明extern "C"您想要查找的C++函数。

如果您关心C++类,那么请查看Qt的QlibraryQPluginLoader以获取灵感。

查看更多about plug-ins

+0

感谢您的回答! 嗯,这是很难说,如果你正确地理解我的问题:-) 但最后我想你的答案是解决我的问题。我想要的是在java中实例化一个C++对象,而无需编写额外的代码(绑定)。使用QPluginLoader解决方案似乎可以在C++中实现这一点。所以我只需要编写一个在java中它调用一些C++代码,然后实例化拨付类结合。 – 2012-03-05 13:27:15