【发布时间】: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