本文背景: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