JNA - calling methods upon C++ instance passed back from DLL
Say I have a C++ DLL with a single exported method such as:
CustomerProcessor* getInstance();
i.e. it simply returns an instance of the class that actually contains the methods I need to call.
I know I can map the getInstance() method to a Class in Java using JNA (extending com.sun.jna.Library), store the returned CustomerProcessor instance in a com.sun.jna.Pointer.
Can I then somehow开发者_JS百科 map this to the CustomerProcessor class so that I can call methods upon it (and if so, how)?
For any arbitrary type* function()
definition you can map the method using JNA as returning a com.sun.jna.Pointer
, but you won't be able to invoke methods on a C++ object from JNA.
A simple workaround for this would be to write a C interface library that simply invokes the method on the objects for you...so if you have some member function foo()
you could export a C method from your C++ code:
extern "C" void bar(type* var){
var->foo();
}
Obviously this will add some work for you...but I suspect the overhead for switching to JNI would be about the same.
JNAerator may facilitate doing what you ask. It has some support for demangling and vtable access (required for calling *this methods).
精彩评论