gpt4 book ai didi

java - 如何在 JNA 中使用 GetProcAddress?

转载 作者:行者123 更新时间:2023-11-27 23:45:54 26 4
gpt4 key购买 nike

首先,我是 JNA 新手。我想通过 java 代码控制主板的 LED 灯。华硕为此提供了一个用 C(C++?)编写的 SDK。

他们的头文件看起来很简单:

#pragma once

#include <Windows.h>


typedef void* MbLightControl;
typedef void* GPULightControl;
typedef void* ClaymoreKeyboardLightControl;
typedef void* RogMouseLightControl;


typedef DWORD(WINAPI* EnumerateMbControllerFunc)(MbLightControl handles[], DWORD size);
typedef DWORD(WINAPI* SetMbModeFunc) (MbLightControl handle, DWORD mode);
typedef DWORD(WINAPI* SetMbColorFunc) (MbLightControl handle, BYTE* color, DWORD size);
typedef DWORD(WINAPI* GetMbColorFunc) (MbLightControl handle, BYTE* color, DWORD size);
typedef DWORD(WINAPI* GetMbLedCountFunc)(MbLightControl handle);

typedef DWORD(WINAPI* EnumerateGPUFunc)(GPULightControl handles[], DWORD size);
typedef DWORD(WINAPI* SetGPUModeFunc) (GPULightControl handle, DWORD mode);
typedef DWORD(WINAPI* SetGPUColorFunc) (GPULightControl handle, BYTE* color, DWORD size);
typedef DWORD(WINAPI* GetGPULedCountFunc)(GPULightControl handle);

typedef DWORD(WINAPI* CreateClaymoreKeyboardFunc)(ClaymoreKeyboardLightControl* handle);
typedef DWORD(WINAPI* SetClaymoreKeyboardModeFunc) (ClaymoreKeyboardLightControl handle, DWORD mode);
typedef DWORD(WINAPI* SetClaymoreKeyboardColorFunc) (ClaymoreKeyboardLightControl handle, BYTE* color, DWORD size);
typedef DWORD(WINAPI* GetClaymoreKeyboardLedCountFunc)(ClaymoreKeyboardLightControl handle);

typedef DWORD(WINAPI* CreateRogMouseFunc)(RogMouseLightControl* handle);
typedef DWORD(WINAPI* SetRogMouseModeFunc) (RogMouseLightControl handle, DWORD mode);
typedef DWORD(WINAPI* SetRogMouseColorFunc) (RogMouseLightControl handle, BYTE* color, DWORD size);
typedef DWORD(WINAPI* RogMouseLedCountFunc)(RogMouseLightControl handle);

我使用 JNAerator 获取 JNA 映射,这是我得到的结果:

import com.ochafik.lang.jnaerator.runtime.LibraryExtractor;
import com.ochafik.lang.jnaerator.runtime.MangledFunctionMapper;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLibrary;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
import com.sun.jna.win32.StdCallLibrary.StdCallCallback;

public interface Aura extends Library {

String JNA_LIBRARY_NAME = LibraryExtractor.getLibraryPath("AURA_SDK", true, Aura.class);

NativeLibrary JNA_NATIVE_LIB = NativeLibrary.getInstance(Aura.JNA_LIBRARY_NAME, MangledFunctionMapper.DEFAULT_OPTIONS);

Aura INSTANCE = (Aura) Native.loadLibrary(Aura.JNA_LIBRARY_NAME, Aura.class, MangledFunctionMapper.DEFAULT_OPTIONS);

interface EnumerateMbControllerFunc extends StdCallCallback {
int apply(PointerByReference handles, int size);
}

interface SetMbModeFunc extends StdCallCallback {
int apply(Pointer handle, int mode);
}

interface SetMbColorFunc extends StdCallCallback {
int apply(Pointer handle, Pointer color, int size);
}

interface GetMbColorFunc extends StdCallCallback {
int apply(Pointer handle, Pointer color, int size);
}

interface GetMbLedCountFunc extends StdCallCallback {
int apply(Pointer handle);
}

interface EnumerateGPUFunc extends StdCallCallback {
int apply(PointerByReference handles, int size);
}

interface SetGPUModeFunc extends StdCallCallback {
int apply(Pointer handle, int mode);
}

interface SetGPUColorFunc extends StdCallCallback {
int apply(Pointer handle, Pointer color, int size);
}

interface GetGPULedCountFunc extends StdCallCallback {
int apply(Pointer handle);
}

interface CreateClaymoreKeyboardFunc extends StdCallCallback {
int apply(PointerByReference handle);
}

interface SetClaymoreKeyboardModeFunc extends StdCallCallback {
int apply(Pointer handle, int mode);
}

interface SetClaymoreKeyboardColorFunc extends StdCallCallback {
int apply(Pointer handle, Pointer color, int size);
}

interface GetClaymoreKeyboardLedCountFunc extends StdCallCallback {
int apply(Pointer handle);
}

interface CreateRogMouseFunc extends StdCallCallback {
int apply(PointerByReference handle);
}

interface SetRogMouseModeFunc extends StdCallCallback {
int apply(Pointer handle, int mode);
}

interface SetRogMouseColorFunc extends StdCallCallback {
int apply(Pointer handle, Pointer color, int size);
}

interface RogMouseLedCountFunc extends StdCallCallback {
int apply(Pointer handle);
}
}

在示例 C++ 代码中,他们使用 GetProcAddress 获取上述方法的地址,这样他们就可以调用它们:

HMODULE hLib = nullptr;

hLib = LoadLibraryA("AURA_SDK.dll");

(FARPROC&)EnumerateMbController = GetProcAddress(hLib, "EnumerateMbController");

DWORD _count = EnumerateMbController(NULL, 0);

我如何用 JNA 做同样的事情?

提前致谢。

最佳答案

我不知道为什么头文件看起来是这样,但是根据您提供的 C 示例,库 AURA_SDK 中的函数 EnumerateMbController 是使用两个参数调用 - 第一个是 MbLightControl 数组(这些是不透明指针),第二个是表示“大小”的 an。

我会从上下文中推断出:

  • MbLightControl 数组将接收指针
  • size 是你提供的数组的大小
  • 函数的返回值将是真正返回的MbLightControl条目数

带有 NULL 的调用表明,它将返回它将返回的 MbLightControl 实例的数量。

我对正确绑定(bind)的建议:

public interface Aura extends StdCallLibrary {

Aura INSTANCE = Native.loadLibrary("AURA_SDK", Aura.class, W32APIOptions.DEFAULT_OPTIONS);

public static class MbLightControl extends WinDef.PVOID {}

public int EnumerateMbController(MbLightControl[] handles, int size);
public int SetMbMode(MbLightControl handle, int mode);
public int SetMbColor(MbLightControl handle, byte[] color, int size);
public int GetMbColor(MbLightControl handle, byte[] color, int size);
public int GetMbLedCount(MbLightControl handle);
}

这会加载名为 AURA_SDK 的 dll 并使五个函数可访问。它还模仿了 MbLightControl 头文件中的 typedef。 DWORD 绑定(bind)为 java int 以使调用更容易,因为 java 中的 int 始终是 32 位,而 Windows 上的 DWORD 是一样。

我不知道颜色代码的细节,但如果这些是 RGB LED,那么我假设每个 LED 将占用字节数组中的 3 个字节。

了解 JNA 在后台使用 LoadLibraryEx(LoadLibrary 的老大哥)和 GetProcAddress 来加载函数可能会有所帮助.

关于java - 如何在 JNA 中使用 GetProcAddress?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50620781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com