delphi java调用方法_Delphi FMX调用JAR里的JAVA类Init方法

本文介绍了在Delphi XE10.3 RIO下,由于FMX的JNIBridge将`init`视为默认构造函数导致的调用错误。提供了一个临时解决方案,通过修改`TU2FixJavaClassInit`函数来修复JNI方法调用信息表,使得可以正确调用JAR中`init`方法的类和对象。
摘要由CSDN通过智能技术生成

本文背景:Delphi XE10.3 RIO

由于FMX的JNIBridge将init作为默认的JAVA对象构造函数名,JAR中如果有方法名为init的类方法,FMX都会映射为构成函数,造成调用失败。这一问题需要官方修改Androidapi.JNIBridge单元的MethodIDFor方法逻辑,这里给出一个临时的Fix方法。

unit TU2Helper.Android;

interface

uses System.TypInfo;

procedure TU2FixJavaClassInit(const CTypeInfo: PTypeInfo; const ClsID: Pointer);

implementation

uses System.Rtti, System.SysUtils, System.Generics.Collections,

Androidapi.Jni, Androidapi.JNIMarshal, Androidapi.JNIBridge;

procedure GetMethodsInVTableOrder(const RttiType: TRttiType; const Methods:TList); overload;

var

BaseType: TRttiType;

Method: TRttiMethod;

begin

BaseType := RttiType.BaseType;

if BaseType <> nil then

GetMethodsInVTableOrder(BaseType, Methods);

for Method in RttiType.GetDeclaredMethods do

Methods.Add(Method);

end;

function TU2GetMethodsInVTableOrder(const CTypeInfo: PTypeInfo): TList;

var

Context: TRttiContext;

RttiType: TRttiType;

begin

Result := nil;

Context := TRttiContext.Create;

try

RttiType := Context.GetType(CTypeInfo);

if RttiType <> nil then

begin

Result := TList.Create;

GetMethodsInVTableOrder(RttiType, Result);

end;

finally

Context.Free;

end;

end;

function MangleType(const AType: TRttiType): string; forward;

function MangleGenericType(const AType: TRttiType): string;

var

BaseName: string;

Context: TRttiContext;

ArrType: TRttiType;

begin

BaseName := AType.ToString;

BaseName := BaseName.Substring(BaseName.IndexOf('

BaseName := BaseName.Substring(0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值