我目前正致力于通过 JNI 将具有 DLL 依赖项的 C++ 代码集成到 Java。我需要保留 C++ 的对象实例以供后续通过 Java 调用。
谁能帮助我了解如何将类实例传递给 Java。感谢此处的帮助。
#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 to return the instance UIL to JAVA**
}
}
UIL.hpp
class UIL {
public:
//! constructor for the 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;
};
最佳答案
我使用 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 the 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);
}
}
关于java - 如何将 C++ 类连接到 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39197560/