WebRT C cra sh AbstractMethodError из-за метода onTrack в PeerConnection Observer - PullRequest
3 голосов
/ 27 января 2020

Я использую Intel webRt c. Соединение установлено успешно, но эта ошибка возникает при запуске вызова и нажатии кнопки publi sh.

java .lang.AbstractMethodError: abstract method "void org.webrt c .PeerConnection $ Observer.onTrack (org.webrt c .RtpTransceiver) "

E / rt c: фатальная ошибка в: gen / sdk / android / generate_base_jni / jni /../../ .. /../../../../third_party/webrtc/sdk/android/src/jni/jni_generator_helper.h, строка 38 A / lib c: фатальный сигнал 6 (SIGABRT), код -6 в tid 16744 (signaling_threa)

1 Ответ

1 голос
/ 28 февраля 2020

Я подготовил предварительное понимание этой проблемы.

Во-первых, мы должны взглянуть на исходный код Google WebRT C:

public interface Observer {
    @CalledByNative("Observer")
    void onSignalingChange(PeerConnection.SignalingState var1);

    @CalledByNative("Observer")
    void onIceConnectionChange(PeerConnection.IceConnectionState var1);

    @CalledByNative("Observer")
    void onIceConnectionReceivingChange(boolean var1);

    @CalledByNative("Observer")
    void onIceGatheringChange(PeerConnection.IceGatheringState var1);

    @CalledByNative("Observer")
    void onIceCandidate(IceCandidate var1);

    @CalledByNative("Observer")
    void onIceCandidatesRemoved(IceCandidate[] var1);

    @CalledByNative("Observer")
    void onAddStream(MediaStream var1);

    @CalledByNative("Observer")
    void onRemoveStream(MediaStream var1);

    @CalledByNative("Observer")
    void onDataChannel(DataChannel var1);

    @CalledByNative("Observer")
    void onRenegotiationNeeded();

    @CalledByNative("Observer")
    void onAddTrack(RtpReceiver var1, MediaStream[] var2);

    @CalledByNative("Observer")
    default void onTrack(RtpTransceiver transceiver) {
    }
}

Если вы заметили 'onTrack '- единственный метод в interface, который имеет реализацию метода по умолчанию. У него есть "{}" после вместо ";". Эта функция, называемая «методами по умолчанию», была добавлена ​​к Java интерфейсам в Java 8.

Теперь мы получаем ошибку: «AbstractMethodError», вероятно, из-за того, что код JNI не Android 8 знает и ожидает, что клиентский код реализует все методы интерфейса ...

Сначала я решил эту проблему и восстановил рабочие вызовы WebRT C в своем приложении, добавив реализацию метода:

private class Peer implements SdpObserver, PeerConnection.Observer {
     ...

     @Override
     public void onAddStream(MediaStream mediaStream) {}

     @Override
     public void onTrack(RtpTransceiver transceiver) {}    
}

Тем не менее, я думаю, что реальное решение состоит в том, чтобы гарантировать, что весь код в проекте использует Java 1.8:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Если кто-то сможет пролить больше света на то, почему это происходит, я был бы признателен.

...