首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在JNA中使用GetProcAddress?

如何在JNA中使用GetProcAddress?
EN

Stack Overflow用户
提问于 2018-05-31 17:18:11
回答 1查看 528关注 0票数 0

首先,我是一个JNA新手。我想通过java代码来控制我的主板的LED照明。华硕为此提供了一个用C (C++?)编写的软件开发工具包。

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

代码语言:javascript
运行
复制
#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映射,结果如下所示:

代码语言:javascript
运行
复制
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来获取上述方法的地址,这样它们就可以调用它们:

代码语言:javascript
运行
复制
HMODULE hLib = nullptr;

hLib = LoadLibraryA("AURA_SDK.dll");

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

DWORD _count = EnumerateMbController(NULL, 0);

如何使用JNA执行相同的操作?

提前谢谢。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50620781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档