【问题标题】:FireMonkey Android - handle callback message (JHandle) of JAR objectFireMonkey Android - 处理 JAR 对象的回调消息(JHandle)
【发布时间】:2018-07-06 22:02:35
【问题描述】:

我有一个很长一段时间的大问题 - 我到处寻找解决方案,但经过数小时的测试后,我找不到一个明智的解决方案。

我有一个 Zebra 打印机的 JAR 库和一个 PAS 文件 (http://aboutit.pl/MobilePrinter.zip)。我需要一段 Delphi 中的代码来处理来自 JAR 库的回调 (JHandle) 单个过程。

类似这样的:

TPrintCallback = class (TJavaLocal, JHandler_Callback)
  function handleMessage (msg: JMessage): Boolean; cdecl;
end;

TfrmMain = class (TForm)
  [..]
private
  FCallback: TPrintCallback;
  FHandler: JHandler;
end;

[...]

procedure TfrmMain.FormCreate (Sender: TObject);
begin
  FCallback: = TPrintCallback.Create;
  FHandler: = TJHandler.JavaClass.init (FCallback);
  FPrinter1: = TJMobilePrinter.JavaClass.Init (TAndroidHelper.Context,FHandler, TJLooper.JavaClass.getMainLooper);
  [...]
end;

function TPrintCallback.handleMessage (msg: JMessage): Boolean;
begin
  Result: = True;
  ShowMessage (msg.what.ToString + '' + msg.arg1.ToString);
end;

我希望 handleMessage 函数接收消息,例如关于打印机的连接。当然,打印机对象可以做到这一点,但消息不会到达 Delphi 应用程序。

我也尝试了RegisterNatives的方法,也没有成功

procedure RegisterN;
var
  PEnv: PJNIEnv;
  ReceiverClass: JNIClass;
  NativeMethod: JNINativeMethod;
begin
  try
    PEnv := TJNIResolver.GetJNIEnv;
    ReceiverClass := TJNIResolver.GetJavaClassID('com/zebra/printer/service/PrinterHandler');
    NativeMethod.Name := 'handleMessage';
    NativeMethod.Signature := '(Landroid/os/Message;)V';
    NativeMethod.FnPtr := @handleMessage;

    PEnv^.RegisterNatives(PEnv, ReceiverClass, @NativeMethod, 1);
    PEnv^.DeleteLocalRef(PEnv, ReceiverClass);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;

我已准备好为任何提示付费,在哪里寻找解决此问题的方法 - 我绝望了。 ;-)

编辑:

在 Java 中是这样的:

mMobilePrinter = new MobilePrinter(this, mHandler, null);



private final Handler mHandler = new Handler() {
        @SuppressWarnings("unchecked")
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MobilePrinter.MESSAGE_STATE_CHANGE:
                switch (msg.arg1) {
                case MobilePrinter.STATE_CONNECTED:
                    setStatus(getString(R.string.title_connected_to, mConnectedDeviceName));
                    mListView.setEnabled(true);
                    mIsConnected = true;
                    invalidateOptionsMenu();
                    break;

                case MobilePrinter.STATE_CONNECTING:
                    setStatus(R.string.title_connecting);
                    break;


            case MobilePrinter.MESSAGE_PRINT_COMPLETE:
                Toast.makeText(getApplicationContext(), "Complete to print", Toast.LENGTH_SHORT).show();
                break;


            }
        }
    };

我需要在 Delphi 中有过程 handleMessage(Message msg)...

【问题讨论】:

  • 您没有显示足够的代码,或者您缺少一些非常重要的代码,即:在哪里/如果您使用 connect 来实际连接到打印机。此外,使用 ToString 不会将 "what" 和 "arg1" 转换为 Delphi 字符串;您需要为此使用 JStringToString。
  • 当然,JStringToString 是对的,但这不是问题。打印机连接后工作正常,打印正常。但是,为了避免一些问题,我想支持关于建立连接的消息(现在我只是等待几秒钟,我希望连接会成功)。我将处理正确的 handleMessage - 我知道该怎么做。但问题是这个函数根本没有运行 - 没有消息到达它。
  • 如果我真的有 Zebra 打印机,我会看看是否可以解决问题,因为您的代码似乎是正确的,并且您说您连接成功。
  • 如果你为 looper 参数传递 nil 会发生什么?这是什么版本的Delphi?是否可以从将运行 Java 方法的线程中明智地调用 ShowMessage?祝酒信息可能是一个更好的指标吗?
  • 1) nil as looper 没有任何变化 - 消息没有通过 2) Delphi 10.2.2 (Tokyo) 3) 当然你有关于 showmessge 的权利,但这不是问题。这只是一个例子——这个函数永远不会执行

标签: java android delphi jar firemonkey


【解决方案1】:

首先,要知道JAVA的Handler类,以便将Handler类移植到Delhpi!!! 我认为在 dehphi 中,您不会初始化一个 Looper 来延迟 Handler 的消息!在java中,主线程已经这样做了。

【讨论】:

    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多