java - 如何将 C++ 类连接到 Java?

标签 java c++ java-native-interface

我目前正致力于通过 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/

相关文章:

c# - 如何从 C# 调用 native 库?

jsp - 带有 JNI 的 Java bean?

java - 优化帮助 : SQL Query to display minimum prices per country

java - 使用 GridlayoutManager 如何让 3 个 imageView 填充设备宽度?

c++ - 传递字符串参数,从文件中读取

java - 如何使用 JNI 从通过调用 API 启动的 Java 应用程序将数据发送回 C 应用程序?

java - 我如何在类上应用 JNI 而不是将随机函数组合在一起?

java - 在 bean 存档 (jar) 中定义和使用时,CDI 拦截器不起作用

java - 修改 XML 的标签

c++ - Arduino 循环错误 : Waits several seconds to respond to input change