How can I interface a C++ class to Java? -
i'm working on integrating c++ code dll dependencies java through jni. need retain object instance of c++ subsequent call through java.
could me understand how pass class instance java. appreciate here.
#include <windows.h> #include <iostream> #include <stdlib.h> #include <uil.hpp> #include <deviceinfo.hpp> typedef hinstance libraryhandle; // pre-define uil library entry points typedef uil* create_uil(const char*, bool, int, const char**); typedef void delete_uil(uil*); const char* uildriver; bool uilabsolute; int uilparmcount; static libraryhandle uilhandle; int _tmain(int argc, _tchar* argv[]) { uilhandle = loadlibrary(text("uil.dll")); if (uilhandle != null) { create_uil* createuil = (create_uil*)getprocaddress(uilhandle, "createuil"); uil = createuil(uildriver, uilabsolute, uilparmcount, uilparms); **//i need return instance uil java** } }
uil.hpp
class uil { public: //! constructor uil uil(const char * driver_name, bool absolute, int parm_count, const char* parms[]); ~uil(); cppextern void infostring(char* str, int size); cppextern int devicecount(); cppextern int getdevicekey(int index); int getcurrentdevice(); cppextern int getcurrentdeviceindex(); int setdevice(int key); cppextern int setdeviceindex(int index); cppextern int getdeviceinfo(deviceinfo* di); cppextern int getalldevices(deviceinfo* di, int array_size); cppextern int send(unsigned char* buffer); cppextern int getnumwaiting(int &waiting); cppextern int receive(); cppextern int lockdevice(int index, bool lock); cppextern bool islocked(int index); cppextern int receiveinfo(int command_code, int argc, ...); cppextern int ioctl(int command_code, int argc, ...); cppextern int errinfo(int command_code, int argc, ...); int devicelistchangecallback(); cppextern void setlogginglevel(int level); void getversion(int& major, int& minor, int& revision); void getdriverversion(int& major, int& minor, int& revision); const char* errstr(int err_code); uilabstractdriver * getdriver() { return driver; } private: uilabstractdriver* driver; int last_key; int key_map[max_device_count]; int logging_level; char driver_name[81]; void* io_argv[50]; int device_index; };
i found solution answer using jna:
#include <windows.h> #include <iostream> #include <stdlib.h> #include <uil.hpp> #include <deviceinfo.hpp> typedef hinstance libraryhandle; // pre-define uil library entry points typedef uil* create_uil(const char*, bool, int, const char**); typedef void delete_uil(uil*); const char* uildriver; bool uilabsolute; int uilparmcount; static libraryhandle uilhandle; extern "c" __declspec(dllexport) uil* initialize(int hba, int port) { uilhandle = loadlibrary(text("uil.dll")); if (uilhandle != null) { create_uil* createuil = (create_uil*)getprocaddress(uilhandle, "createuil"); uil = createuil(uildriver, uilabsolute, uilparmcount, uilparms); return uil; } }
java
public interface uilinterfacenative extends library{ public pointerbyreference initialize(int hba, int port); public int scan(pointerbyreference uil); } public class main { /** * @param args command line arguments */ public static void main(string[] args) { // todo code application logic here uilinterfacenative uil = (uilinterfacenative)native.loadlibrary("uilinterfacenative", uilinterfacenative.class); pointerbyreference uilpointer = new pointerbyreference(); uilpointer = uil.initialize(0, 2); int device = uil.scan(uilpointer); system.out.println("device found: " + device); } }
Comments
Post a Comment