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里的方法

解决方案 »

  1.   

    4 jna能不能直接调用c# dll的方法
      

  2.   

    目测可能是你的dll版本和jdk不匹配   至于路径这个这一不放在系统盘下
      

  3.   

    如果可以就提前执行:
    System.setProperty("java.library.path","dll所在目录");
    如果不行,就jvm启动时增加参数:-Djava.library.path=[dll所在目录]jna可以省一些jni开发的过程,但也不是万能的,而且限制诸多,自定义的dll吊用起来也是写的好啰嗦
      

  4.   


    现在主要的问题就是这个回调函数的执行,在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;
        enddelphi尝试执行这个java传进来的回调函数时,
              pushButtonEventList[i](interAddress, StrToInt(data[3]), TFunctions.HexToInt(data[5] + data[4]), sysController.id);
    发生了内存访问的错误