I'm trying to implement the latest version of Google Play Services (15.01) in Delphi. I have merged the relevant libraries into a single jar file, and extracted a bridge file with java2op. Everything was running pretty smooth, until i ran into this showstopper:
I have this class:
JRoomConfigClass = interface(JObjectClass)
['{88F39239-F51D-4BA0-8131-24EBF070A584}']
{class} function builder(P1: JRoomUpdateListener): JRoomConfig_Builder;
cdecl; overload;
{class} function builder(P1: JRoomUpdateCallback): JRoomConfig_Builder;
cdecl; overload;
{class} function createAutoMatchCriteria(P1: Integer; P2: Integer; P3:
Int64): JBundle; cdecl;
end;
[JavaSignature('com/google/android/gms/games/multiplayer/realtime/
RoomConfig')]
JRoomConfig = interface(JObject)
['{EF764B81-BF25-490C-8562-D9DC6BB337AD}']
function getAutoMatchCriteria: JBundle; cdecl;
function getInvitationId: JString; cdecl;
function getInvitedPlayerIds: TJavaObjectArray<JString>; cdecl;
function getMessageReceivedListener: JRealTimeMessageReceivedListener; cdecl;
function getOnMessageReceivedListener: JOnRealTimeMessageReceivedListener;
cdecl;
function getRoomStatusUpdateCallback: JRoomStatusUpdateCallback; cdecl;
function getRoomStatusUpdateListener: JRoomStatusUpdateListener; cdecl;
function getRoomUpdateCallback: JRoomUpdateCallback; cdecl;
function getRoomUpdateListener: JRoomUpdateListener; cdecl;
function getVariant: Integer; cdecl;
function zzch: Jrealtime_zzh; cdecl;
end;
TJRoomConfig = class(TJavaGenericImport<JRoomConfigClass, JRoomConfig>) end;
i call method "builder":
rtmConfigBuilder := TJRoomConfig.JavaClass.builder(RoomUpdateCallback);
But RoomUpdateCallback is defined like this:
JRoomUpdateCallbackClass = interface(JRoomUpdateListenerClass)
['{B7973699-780A-4D76-9585-D113DD245CC5}']
{class} function init: JRoomUpdateCallback; cdecl;
end;
[JavaSignature('com/google/android/gms/games/multiplayer/realtime/
RoomUpdateCallback')]
JRoomUpdateCallback = interface(JRoomUpdateListener)
['{0CA35AB2-8AA9-4604-909B-68DE93112867}']
procedure onJoinedRoom(P1: Integer; P2: JRoom); cdecl;
procedure onLeftRoom(P1: Integer; P2: JString); cdecl;
procedure onRoomConnected(P1: Integer; P2: JRoom); cdecl;
procedure onRoomCreated(P1: Integer; P2: JRoom); cdecl;
end;
TJRoomUpdateCallback = class(TJavaGenericImport<JRoomUpdateCallbackClass,
JRoomUpdateCallback>) end;
So, it's not an interface, which means, that i can't use the usual listener approach:
TRoomUpdateListener = class(TJavaLocal, JRoomUpdateCallback)
procedure onJoinedRoom(P1: Integer; P2: JRoom); cdecl;
procedure onLeftRoom(P1: Integer; P2: JString); cdecl;
procedure onRoomConnected(P1: Integer; P2: JRoom); cdecl;
procedure onRoomCreated(P1: Integer; P2: JRoom); cdecl;
end;
But JRoomUpdateCallback is a descendant of JRoomUpdateListener which is an interface:
JRoomUpdateListenerClass = interface(IJavaClass)
['{62795DB4-DDD0-48F2-AABA-644CC96D5E6E}']
end;
[JavaSignature('com/google/android/gms/games/multiplayer/realtime/
RoomUpdateListener')]
JRoomUpdateListener = interface(IJavaInstance)
['{236212AF-A72A-4DEC-BB73-E0B42E80F7A1}']
procedure onJoinedRoom(P1: Integer; P2: JRoom); cdecl;
procedure onLeftRoom(P1: Integer; P2: JString); cdecl;
procedure onRoomConnected(P1: Integer; P2: JRoom); cdecl;
procedure onRoomCreated(P1: Integer; P2: JRoom); cdecl;
end;
TJRoomUpdateListener = class(TJavaGenericImport<JRoomUpdateListenerClass,
JRoomUpdateListener>) end;
How do i implement this? Is it at all possible?