【问题标题】:Delphi Android Java class that inherits from an interface从接口继承的 Delphi Android Java 类
【发布时间】:2018-06-29 13:11:49
【问题描述】:

我正在尝试在 Delphi 中实现最新版本的 Google Play Services (15.01)。我已将相关库合并到一个 jar 文件中,并使用 java2op 提取了一个桥文件。一切都运行得很顺利,直到我遇到了这个showstopper:

我有这门课:

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;

我调用方法“builder”:

rtmConfigBuilder := TJRoomConfig.JavaClass.builder(RoomUpdateCallback);

但是 RoomUpdateCallback 是这样定义的:

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;

所以,它不是一个接口,这意味着我不能使用通常的监听器方法:

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;

但是 JRoomUpdateCallback 是 JRoomUpdateListener 的后代,它是一个接口:

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;

我该如何实现呢?有可能吗?

【问题讨论】:

  • 我在 SO 的 Android 部分发现了类似的问题,例如 (stackoverflow.com/questions/26511788),而您甚至都没有接近。 Android 开发人员首先设置了一个game 实例...
  • 不是这样的。问题是如何以某种方式从 java 类中捕获事件。据我所知,你不能从 java 类下降,但我希望有某种方法,因为 java 类实现了接口。
  • 您在那里的导入似乎没有意义。您从哪里获得 .jar?
  • 该 jar 是从 15.01 版本中的各个 jar 合并而来的,从 maven 存储库下载。
  • 在我看来,您希望定义一个 Delphi 类来实现 Android 侦听器接口。侦听器接口是JRoomUpdateCallback,它继承自JRoomUpdateListener,后者继承自IJavaInstance,这是基本的Android/Java 接口表示。到目前为止,您似乎正在描述一个可以构建侦听器类的完美场景,但您说有一些障碍阻止了您。我不确定这个障碍是什么,如果我遗漏了明确说明的内容,我深表歉意,但是什么不起作用?看起来它应该可以正常工作。

标签: java android delphi


【解决方案1】:

没有办法解决它。我不得不编写一些java代码。如果有人可以从中受益,这就是我放入我的 java 库中的内容。

package cometsoft.com.roomconfiglib;

import 
com.google.android.gms.games.multiplayer.realtime.OnRealTimeMessageReceivedListener;
import com.google.android.gms.games.multiplayer.realtime.RealTimeMessage;
import com.google.android.gms.games.multiplayer.realtime.Room;
import com.google.android.gms.games.multiplayer.realtime.RoomConfig;
import com.google.android.gms.games.multiplayer.realtime.RoomStatusUpdateCallback;
import com.google.android.gms.games.multiplayer.realtime.RoomUpdateCallback;

import android.os.Bundle;
import android.support.annotation.NonNull;

import java.util.ArrayList;
import java.util.List;

interface RoomConfigListener {
    public abstract void onRoomConnecting(@android.support.annotation.Nullable 
com.google.android.gms.games.multiplayer.realtime.Room room);

public abstract void onRoomAutoMatching(@android.support.annotation.Nullable 
com.google.android.gms.games.multiplayer.realtime.Room room);

public abstract void onPeerInvitedToRoom(@android.support.annotation.Nullable 
com.google.android.gms.games.multiplayer.realtime.Room room, 
   @android.support.annotation.NonNull java.util.List<java.lang.String> list);

public abstract void onPeerDeclined(@android.support.annotation.Nullable 
com.google.android.gms.games.multiplayer.realtime.Room room, 
@android.support.annotation.NonNull java.util.List<java.lang.String> list);

public abstract void onPeerJoined(@android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room, 
   @android.support.annotation.NonNull java.util.List<java.lang.String> list);

public abstract void onPeerLeft(@android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room, 
   @android.support.annotation.NonNull java.util.List<java.lang.String> list);

public abstract void onConnectedToRoom(@android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room);

public abstract void onDisconnectedFromRoom(@android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room);

public abstract void onPeersConnected(@android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room, 
   @android.support.annotation.NonNull java.util.List<java.lang.String> list);

public abstract void onPeersDisconnected(@android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room, 
   @android.support.annotation.NonNull java.util.List<java.lang.String> list);

public abstract void onP2PConnected(@android.support.annotation.NonNull 
   java.lang.String s);

public abstract void onP2PDisconnected(@android.support.annotation.NonNull 
   java.lang.String s);

public abstract void onRoomCreated(int i, @android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room);

public abstract void onJoinedRoom(int i, @android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room);

public abstract void onLeftRoom(int i, @android.support.annotation.NonNull 
   java.lang.String s);

public abstract void onRoomConnected(int i, @android.support.annotation.Nullable 
   com.google.android.gms.games.multiplayer.realtime.Room room);

void onRealTimeMessageReceived(@android.support.annotation.NonNull 
   com.google.android.gms.games.multiplayer.realtime.RealTimeMessage 
   realTimeMessage);

}

public class RoomConfigBuilder {

    private RoomConfigListener mRoomConfigListener;
    private Bundle mautoMatchCriteria;

    private RoomUpdateCallback mRoomUpdateCallback = new RoomUpdateCallback() {

        @Override
        public void onRoomCreated(int statusCode, Room room) {
            mRoomConfigListener.onRoomCreated(statusCode, room);
        }

        @Override
        public void onRoomConnected(int statusCode, Room room) {
            mRoomConfigListener.onRoomConnected(statusCode, room);
        }

        @Override
        public void onJoinedRoom(int statusCode, Room room) {
            mRoomConfigListener.onJoinedRoom(statusCode, room);
        }

        @Override
        public void onLeftRoom(int statusCode, @NonNull String roomId) {
            mRoomConfigListener.onLeftRoom(statusCode, roomId);
        }

    };

    private RoomStatusUpdateCallback mRoomStatusUpdateCallback = new 
       RoomStatusUpdateCallback() {

        @Override
        public void onConnectedToRoom(Room room) {
            mRoomConfigListener.onConnectedToRoom(room);
        }

        @Override
        public void onDisconnectedFromRoom(Room room) {
            mRoomConfigListener.onDisconnectedFromRoom(room);
        }

        @Override
        public void onPeerDeclined(Room room, @NonNull List<String> arg1) {
            mRoomConfigListener.onPeerDeclined(room, arg1);
        }

        @Override
        public void onPeerInvitedToRoom(Room room, @NonNull List<String> arg1) {
            mRoomConfigListener.onPeerInvitedToRoom(room, arg1);
        }

        @Override
        public void onP2PDisconnected(@NonNull String participant) {
            mRoomConfigListener.onP2PDisconnected(participant);
        }

        @Override
        public void onP2PConnected(@NonNull String participant) {
            mRoomConfigListener.onP2PConnected(participant);
        }

        @Override
        public void onPeerJoined(Room room, @NonNull List<String> arg1) {
            mRoomConfigListener.onPeerJoined(room, arg1);
        }

        @Override
        public void onPeerLeft(Room room, @NonNull List<String> peersWhoLeft) {
            mRoomConfigListener.onPeerLeft(room, peersWhoLeft);
        }

        @Override
        public void onRoomAutoMatching(Room room) {
            mRoomConfigListener.onRoomAutoMatching(room);
        }

        @Override
        public void onRoomConnecting(Room room) {
            mRoomConfigListener.onRoomConnecting(room);
        }

        @Override
        public void onPeersConnected(Room room, @NonNull List<String> peers) {
            mRoomConfigListener.onPeersConnected(room, peers);
        }

        @Override
        public void onPeersDisconnected(Room room, @NonNull List<String> peers) {
            mRoomConfigListener.onPeersDisconnected(room, peers);
        }
    };

    private OnRealTimeMessageReceivedListener mOnRealTimeMessageReceivedListener = 
       new OnRealTimeMessageReceivedListener() {
        @Override
        public void onRealTimeMessageReceived(@NonNull RealTimeMessage 
           realTimeMessage) {
            mRoomConfigListener.onRealTimeMessageReceived(realTimeMessage);
        }
    };

    public RoomConfig BuildRoomConfig(RoomConfigListener listener, Bundle 
           autoMatchCriteria, ArrayList<String> invitees, String invitationId) {
        mRoomConfigListener = listener;
        mautoMatchCriteria = autoMatchCriteria;
        RoomConfig.Builder mRoomConfigBuilder;

        mRoomConfigBuilder = 
           RoomConfig.builder(mRoomUpdateCallback)
           .setRoomStatusUpdateCallback(mRoomStatusUpdateCallback)
           .setOnMessageReceivedListener(mOnRealTimeMessageReceivedListener);

        if (invitees != null){
           mRoomConfigBuilder.addPlayersToInvite(invitees);
        }

        if (autoMatchCriteria != null){
            mRoomConfigBuilder.setAutoMatchCriteria(mautoMatchCriteria);
        }

        if (invitationId != null){
            mRoomConfigBuilder.setInvitationIdToAccept(invitationId);
        }

        return mRoomConfigBuilder.build();
    }
}

【讨论】:

  • 那现在应该很容易转化为 Delphi 了吧?
猜你喜欢
  • 2020-12-27
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多