Question

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 map this to the CustomerProcessor class so that I can call methods upon it (and if so, how)?

Was it helpful?

Solution

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.

OTHER TIPS

JNAerator may facilitate doing what you ask. It has some support for demangling and vtable access (required for calling *this methods).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top