Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;二进制到Java获取;java.lang.Error:无效内存访问“; 我有一个java库接口(通过JNA)和一个本地C++ DLL。此DLL提供函数来设置在发生某些硬件事件时调用的回调_Java_C++_Winapi_Callback_Jna - Fatal编程技术网

C++;二进制到Java获取;java.lang.Error:无效内存访问“; 我有一个java库接口(通过JNA)和一个本地C++ DLL。此DLL提供函数来设置在发生某些硬件事件时调用的回调

C++;二进制到Java获取;java.lang.Error:无效内存访问“; 我有一个java库接口(通过JNA)和一个本地C++ DLL。此DLL提供函数来设置在发生某些硬件事件时调用的回调,java,c++,winapi,callback,jna,Java,C++,Winapi,Callback,Jna,除了一个回调之外,所有这些回调都可以工作,尽管它与另一个回调的定义几乎相同 这些回调签名和枚举是用C++代码定义的: typedef enum\u KEYSTATE { KEYSTATE_NONE=0, 基斯塔特·奥普, 键状态为“关闭”, 键状态保持, KEYSTATE_无效, }KEYSTATETYPE,*P_KEYSTATETYPE; typedef枚举_DKTYPE { DK_NONE=0, DK_1, DK_2, DK_3, DK_4, DK_5, DK_6, DK_7, DK_8,

除了一个回调之外,所有这些回调都可以工作,尽管它与另一个回调的定义几乎相同

这些回调签名和枚举是用C++代码定义的:

typedef enum\u KEYSTATE
{
KEYSTATE_NONE=0,
基斯塔特·奥普,
键状态为“关闭”,
键状态保持,
KEYSTATE_无效,
}KEYSTATETYPE,*P_KEYSTATETYPE;
typedef枚举_DKTYPE
{
DK_NONE=0,
DK_1,
DK_2,
DK_3,
DK_4,
DK_5,
DK_6,
DK_7,
DK_8,
DK_9,
DK_10,
DK_无效,
DK_计数=10
}DK型,*P_DK型;
typedef枚举\u GESTURETYPE
{
手势\u NONE=0x00000000,
手势按=0x00000001,
手势点击=0x00000002,
手势\u FLICK=0x00000004,
手势缩放=0x00000008,
手势旋转=0x00000010,
手势移动=0x00000020,
手势保持=0x00000040,
手势释放=0x00000080,
手势_滚动=0x00000100,
手势\u ALL=0xFFFF
}GESTURETYPE,*P_GESTURETYPE;
typedef枚举_事件类型
{
事件\无=0,
事件_已激活,
事件u已停用,
活动结束,
事件(u)退出,,
事件_无效,
}EVENTTYPETYPE,*P_EVENTTYPETYPE;
typedef HRESULT(回调*DynamicKeyCallbackFunctionType)(DKTYPE,KEYSTATETYPE);
typedef HRESULT(回调*AppEventCallbackType)(EVENTTYPETYPE,DWORD,DWORD);
typedef HRESULT(回调*TouchpadGestureCallbackFunctionType)(GESTURETYPE、DWORD、WORD、WORD);
typedef HRESULT(回调*键盘回调函数类型)(UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM);
Java中为回调定义了以下接口:

接口dynamickeycallback函数扩展StdCallLibrary.StdCallCallback{
int回调(int-rawDynamicKeyType,int-rawDynamicKeyState);
}
接口AppEventCallbackFunction扩展StdCallLibrary.StdCallCallback{
int回调(int appEventType、WinDef.UINT dwAppMode、WinDef.UINT dwProcessID);
}
接口TouchPadGestureCallback函数扩展StdCallLibrary.stdcallCallCallback{
int回调(int gestureType、WinDef.UINT dwParameters、,
WinDef.USHORT wXPos、WinDef.USHORT wYPos、WinDef.USHORT wZPos);
}
接口KeyboardCallback函数扩展StdCallLibrary.StdCallCallback{
int回调(WinDef.UINT uMsg、WinDef.UINT_PTR wParam、WinDef.int_PTR lParam);
}
使用API/库类/接口中的这些函数进行设置:

//它们在RazerAPI.java文件中定义为包装器,以简化使用
//lib是来自JNA的RazerLibrary的实例
公共Hresult RzSBAppEventSetCallback(AppEventCallback函数回调){
返回Hresult.getFromApiValue(lib.rzsbapeventsetcallback(callback));
}
公共Hresult RZSBDDynamicKeySetCallback(DynamicKeyCallback函数回调){
返回Hresult.getFromApiValue(lib.RzSBDynamicKeySetCallback(callback));
}
公共Hresult RzSBKeyboardCaptureSetCallback(键盘调用函数回调){
返回Hresult.getFromApiValue(lib.RzSBKeyboardCaptureSetCallback(callback));
}
公共Hresult RzSBGestureSetCallback(TouchPadGestureCallback函数回调){
返回Hresult.getFromApiValue(lib.rzsbgesturestsetcallback(callback));
}
//这些是传递给JNA的接口RazerLibrary.java文件中的方法
int rzSBAppEventCallback(RazerAPI.appEventCallback函数回调);
int RzSBDynamicKeySetCallback(RazerAPI.dynamickeycallback函数回调);
int RzSBKeyboardCaptureSetCallback(RazerAPI.keyboardcallback函数回调);
int RzSBGestureSetCallback(RazerAPI.touchpadgestureCallback函数回调);
在注册回调时,会使用类似的方法(简化为不会出现数百行的混乱,文章末尾会有指向完整代码文件的链接)

公共类RazerManager实现DynamicKeyCallbackFunction{
私有静态DynamicCallbackFunction dkCallback;
私人剃须刀管理器(){
dkCallback=这个;
RazerAPI=RazerAPI.INSTANCE;
api.RzSBDynamicKeySetCallback(dkCallback);
}
@凌驾
公共int回调(int类型,int状态){
System.out.printf(“DK回调:%s%s”,类型,状态);
返回0;//S\u确定
}
}
公共类Touchpad实现TouchpadGestureCallbackFunction{
私有静态TouchpadGestureCallbackFunction gestureCallback;
专用触摸板(){
手势回调=这个;
RazerAPI=RazerAPI.INSTANCE;
api.RzSBGestureSetCallback(gestureCallback);
}
@凌驾
公共int回调(int gestureType、UINT参数、USHORT x、USHORT y、USHORT z){
System.out.printf(“手势:%s”,手势类型);
}
}
RazerManager的实例在用于测试的简单swing应用程序的主循环中创建,RazerManager在其构造函数中创建Touchpad的实例。while循环用于处理消息,GetMessage后跟Translate和DispatchMessage(如果有效),如下所示:

公共类主{
公共静态void main(字符串[]args)引发IOException{
//调用javax的invokeLater运行应用程序
}
公用干管(){
/*JFrame在此处创建,然后用setVisible(true)显示;*/
RazerManager=RazerManager.getInstance();
//是的,这是可怕的,阻止一切,但它只是
//用于获取要通过的消息并触发回调
WinUser.MSG=新的WinUser.MSG();
while(true){
int hasMessage=User32.INSTANCE.GetMessage(msg,null,0,0);
如果(hasMessage!=0){
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessage(msg);
}
}
}
}
现在,手势事件处理得很好,Touchpad类中的回调被调用并正确返回。生成动态密钥事件时,在处理windows消息时在循环内引发异常:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Invalid memory access
  at com.sun.jna.Native.invokeInt(Native Method)
  at com.sun.jna.Function.invoke(Function.java:383)
  at com.sun.jna.Function.invoke(Function.java:315)
  at com.sun.jna.Library$Handler.invoke(Library.java:212)
  at com.sun.proxy.$Proxy11.DispatchMessage(Unknown Source)
  at com.sharparam.jblade.tester.Main.<init>(Main.java:113)
  at com.sharparam.jblade.tester.Main$1.run(Main.java:25)
  at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
  at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
  at java.awt.EventQueue.access$200(EventQueue.java:103)
  at java.awt.EventQueue$3.run(EventQueue.java:694)
  at java.awt.EventQueue$3.run(EventQueue.java:692)
  at java.security.AccessController.doPrivileged(Native Method)
  at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
  at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
  at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
  at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
  at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
线程“AWT-EventQueue-0”java.l中出现异常