JNA - 从DLL传回的C ++实例上的调用方法

时间:2009-12-09 11:12:50

标签: java jna

假设我有一个带有单个导出方法的C ++ DLL,例如:

CustomerProcessor* getInstance();

即。它只返回实际包含我需要调用的方法的类的实例。

我知道我可以使用JNA(扩展com.sun.jna.Library)将getInstance()方法映射到Java中的Class,将返回的CustomerProcessor实例存储在com.sun.jna.Pointer中。

然后我可以以某种方式将它映射到CustomerProcessor类,以便我可以调用它的方法(如果是,如何)?

2 个答案:

答案 0 :(得分:2)

对于任何任意type* function()定义,您可以使用JNA将方法映射为返回com.sun.jna.Pointer,但您将无法从JNA调用C ++对象上的方法。

一个简单的解决方法是编写一个C接口库,它只是为你调用对象的方法...所以如果你有一个成员函数foo(),你可以从C ++导出一个C方法代码:

extern "C" void bar(type* var){
   var->foo();
}

显然这会为你增加一些工作......但我怀疑转换到JNI的开销大致相同。

答案 1 :(得分:1)

JNAerator(http://code.google.com/p/jnaerator/)可能会帮助您完成所要求的工作。它对demangling和vtable访问有一些支持(调用* this方法所需)。