获取回调函数的返回值

redlightguang 2018-05-11 10:25:44
最近做安卓开发,JAVA比较好处理,Delphi没有头绪。
原型 void checkCard(int cardType, ReadCardCallback callback, int timeOut)
callback[入参] 回调
ReadCardCallback-回调
class ReadCallback extends ReadCardCallback.Stub{
@Override
public void onCardDetected (CardInfo cardInfo) throws RemoteException {
}
@Override
public void onError(int code, string message) throws RemoteException {
}
@Override
public void onStartCheckCard () throws RemoteException {
}
}
------------------以上是JAVA说明-------------
checkCard(1 ,readCardCallback,1); //翻译成Delphi
function readCardCallback: JReadCardCallback;
begin
//可以进回调函数
//怎么才能再进行后边的onCardDetected或 onError 呢?
end;


...全文
3261 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
redlightguang 2018-05-22
  • 打赏
  • 举报
回复
我的代码没有贴完,是有readCardCallback1 := TJReadCallback.Create; 不过还是对JAVA不特别熟悉原因吧,希望能私信或留下QQ,付费解决问题,谢谢
  • 打赏
  • 举报
回复
procedure TFrmMain.TReadCard.onCardDetected(P1: JPayCardInfo); 为什么要把TReadCard写到Form类里,这是一个独立的类。
  • 打赏
  • 举报
回复
因为你没有创建实例,前一贴的回复因为复制你的代码,少写了一个1: var readCardCallback1: TJReadCallback; //... readCardCallback1 := TJReadCallback.Create; checkCard(1 ,readCardCallback1,1);
redlightguang 2018-05-14
  • 打赏
  • 举报
回复
研究了几天,但是Delphi这方面资料太少了; 而且还涉及到Binder //-----------------------------------------------JAVA翻译------------------------------------------------------- JReadCardCallback_Stub_ProxyClass = interface(JObjectClass) ['{24347486-9D63-45A9-8581-2215A5A51DDE}'] end; [JavaSignature('com/sunmi/payservice/hardware/aidl/ReadCardCallback$Stub$Proxy')] JReadCardCallback_Stub_Proxy = interface(JObject) ['{61A3521A-A9C4-4868-9DAC-F73DB48934F5}'] function asBinder: JIBinder; cdecl; function getInterfaceDescriptor: JString; cdecl; procedure onStartCheckCard; cdecl; procedure onCardDetected(cardInfo: JPayCardInfo); cdecl; procedure onError(code: Integer; amessage: JString); cdecl; end; TJReadCardCallback_Stub_Proxy = class(TJavaGenericImport<JReadCardCallback_Stub_ProxyClass, JReadCardCallback_Stub_Proxy>) end; JReadCardCallback_StubClass = interface(JBinderClass) ['{217D096C-8935-4715-AFC5-9D3429B6012C}'] {class} function init: JReadCardCallback_Stub; cdecl; {class} function asInterface(obj: JIBinder): JReadCardCallback; cdecl; end; [JavaSignature('com/sunmi/payservice/hardware/aidl/ReadCardCallback$Stub')] JReadCardCallback_Stub = interface(JBinder) ['{E355D7BA-1027-4B37-9691-89D898C3BBA5}'] { Property Methods } { methods } function asBinder: JIBinder; cdecl; function onTransact(code: Integer; data: JParcel; reply: JParcel; flags: Integer): Boolean; cdecl; { Property } end; TJReadCardCallback_Stub = class(TJavaGenericImport<JReadCardCallback_StubClass, JReadCardCallback_Stub>) end; JReadCardCallbackClass = interface(JObjectClass) ['{A8E20EA0-8D14-4321-81F8-824001112566}'] end; [JavaSignature('com/sunmi/payservice/hardware/aidl/ReadCardCallback')] JReadCardCallback = interface(IJavaInstance) ['{C397CCE0-1C52-43C4-AA79-268CE37C6707}'] { Property Methods } { methods } function asBinder: JIBinder; cdecl; //自动翻译的时候没有,自己添加上去的 procedure onStartCheckCard; cdecl; procedure onCardDetected(P1: JPayCardInfo); cdecl; procedure onError(P1: Integer; P2: JString); cdecl; { Property } end; TJReadCardCallback = class(TJavaGenericImport<JReadCardCallbackClass, JReadCardCallback>) end; //----------------------------------------翻译结束--------------------------------------------------------------------------- type TReadCard = class(TJavaLocal, JReadCardCallback) private [weak] FParent : TFrmMain; public constructor Create(AParent : TFrmMain); function asBinder: JIBinder; cdecl; procedure onStartCheckCard; cdecl; procedure onCardDetected(P1: JPayCardInfo); cdecl; procedure onError(P1: Integer; P2: JString); cdecl; end; 按checkCard(1 ,readCardCallback,1); procedure TFrmMain.TReadCard.onCardDetected(P1: JPayCardInfo); begin //没有进入到该函数 看JAVA里有 class ReadCallback extends ReadCardCallback.Stub{ end; 是不是还差一步什么操作?请大神指点下
  • 打赏
  • 举报
回复
Java没有函数指针,连指针都没有,所以它的回调要通过对象完成,传入的是一个对象实例,回调的时候它会调用该对象的某个方法。所以你要调用Java代码,就得按照它的套路来,这个JReadCardCallback应该是Delphi生成的Java回调原型的interface,你需要实现该接口的方法: type TJReadCallback = class(TJavaLocal, JReadCardCallback) public procedure onCardDetected (cardInfo: JCardInfo); cdecl; // 类型应该在接口文件中有 //... end; procedure TJReadCallback.onCardDetected (cardInfo: JCardInfo); begin // 回调处理代码 end; 使用: var readCardCallback1: TJReadCallback; //... readCardCallback1 := TJReadCallback.Create; checkCard(1 ,readCardCallback,1); 如果接口文件中除了JReadCardCallback已经生成了TJReadCardCallback类型,直接从它派生应该也可以。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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