intelij idea 利用jna调用delphi dll的问题

ilikeff8 2018-03-06 05:15:42
1 Delphi中的回调函数,如何使用jna来调用?

function AddOnPushButtonEvent(pushButtonEvent: TPushButtonEvent): integer; stdcall;
begin
result := -1;

try
TApi.Instance.pushButtonEventList.Add(pushButtonEvent);

result := 0;
except
end;
end;

TPushButtonEvent = procedure(interAddress: Integer; light: Integer; number: Integer; controllerid: integer) of object;


按网上的写法,这个回调函数并没有生效

public class DllImportDefine {
public interface ISysControllerApi_Callback_PushButtonEvent extends StdCallCallback {
public void PushButtonEvent(int interAddress, int light, int number, int controllerID);
}

public interface ISysControllerApi extends Library {
public ISysControllerApi sysControllerApi = (ISysControllerApi) Native.loadLibrary("c:\\Windows\\System32\\SysControllerApiForJava\\SysControllerApi2", ISysControllerApi.class);

public int OpenController(String customSearchDeviceList);

public int AddOnPushButtonEvent(ISysControllerApi_Callback_PushButtonEvent pushButtonEvent);
}

// main gui form中,点击按钮后:
sysControllerApi.AddOnPushButtonEvent(sysControllerApi_Callback_PushButtonEvent);

public static class SysControllerApi_Callback_PushButtonEvent implements DllImportDefine.ISysControllerApi_Callback_PushButtonEvent {
public void PushButtonEvent(int interAddress, int light, int number, int controllerID) {
// 并没有进来
JOptionPane.showMessageDialog(null, String.format("%d,%d,%d,%d", interAddress, light, number, controllerID));
}
}



2 DLL是不是只能放在c:\\Windows\\System32\\ 下面?似乎放在其他地方就找不到了
3 如何和delphi xe 联调,现在是用了网上一个工具把导出的jar用Launch.exe来调用,以实现吧java变成exe了。但无法在delphi里运行dll并用这个宿主exe启动,以达到运行这个java的exe后,进入dll时,可以单步跟踪dll里的方法
...全文
1065 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2018-03-15
  • 打赏
  • 举报
回复
up一下。。。
ilikeff8 2018-03-13
  • 打赏
  • 举报
回复
引用 3 楼 zoeg 的回复:
如果可以就提前执行: System.setProperty("java.library.path","dll所在目录"); 如果不行,就jvm启动时增加参数:-Djava.library.path=[dll所在目录] jna可以省一些jni开发的过程,但也不是万能的,而且限制诸多,自定义的dll吊用起来也是写的好啰嗦
现在主要的问题就是这个回调函数的执行,在java里 sysControllerApi.AddOnPushButtonEvent(sysControllerApi_Callback_PushButtonEvent); 把回调函数传给delphi dll后,测试结果是delphi里当运行到这个sysControllerApi_Callback_PushButtonEvent时,

      if Assigned(pushButtonEventList) then
      begin
        // ShowMessage('p6');

        for i := 0 to pushButtonEventList.Count - 1 do
        begin
          ShowMessage('had event,count:' + inttostr(pushButtonEventList.Count));
          ShowMessage(Format('light:%d number:%d conrollerId:%d', [StrToInt(data[3]), TFunctions.HexToInt(data[5] + data[4]), sysController.id]));
          showmessage(format('event handle:%p',[@pushButtonEventList[0]]));

          pushButtonEventList[i](interAddress, StrToInt(data[3]), TFunctions.HexToInt(data[5] + data[4]), sysController.id);
        end;
      end;
    except
      on ex: exception do
      begin
        ShowMessage('pe:' + ex.Message);

        AppendSysControllerApiLog(string.Format('[error] PushButton_TAL600_Report 触发事件-拍灯上报反馈 %s', [ex.Message]));

        raise;
      end;
    end
delphi尝试执行这个java传进来的回调函数时, pushButtonEventList[i](interAddress, StrToInt(data[3]), TFunctions.HexToInt(data[5] + data[4]), sysController.id); 发生了内存访问的错误
ilikeff8 2018-03-13
  • 打赏
  • 举报
回复



zoeg 2018-03-13
  • 打赏
  • 举报
回复
如果可以就提前执行: System.setProperty("java.library.path","dll所在目录"); 如果不行,就jvm启动时增加参数:-Djava.library.path=[dll所在目录] jna可以省一些jni开发的过程,但也不是万能的,而且限制诸多,自定义的dll吊用起来也是写的好啰嗦
xiongdejun 2018-03-06
  • 打赏
  • 举报
回复
目测可能是你的dll版本和jdk不匹配 至于路径这个这一不放在系统盘下
ilikeff8 2018-03-06
  • 打赏
  • 举报
回复
4 jna能不能直接调用c# dll的方法

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧