我使用英特尔webRtc。连接成功,但当调用启动并单击“发布”按钮时会发生此错误。
java.lang.AbstractMethodError:抽象方法"void java.lang.AbstractMethodError“
E/rtc: gen/sdk/android/generated_base_jni/jni/../../../../../../../third_party/webrtc/sdk/android/src/jni/jni_generator_helper.h,行38A/libc中的致命错误:致命信号6 (SIGABRT),在tid 16744 (signaling_threa)中编码-6
发布于 2020-02-28 17:34:55
我对这个问题有了初步的了解。
首先,我们应该看看Google的WebRTC源代码:
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 8中的Java接口中。
现在我们遇到的错误"AbstractMethodError“可能是因为JNI代码不知道Android8,并且期望客户端代码实现接口中的所有方法.
我最初解决了这个问题,并通过添加方法的实现将工作的WebRTC调用还原到我的应用程序中:
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
}
如果有人能更清楚地了解为什么会发生这种情况,我将不胜感激。
编辑:
这个问题也可以通过将Gradle版本从3.5.2
更改为3.4.1
来解决,但其他组合也可能有效。
https://stackoverflow.com/questions/59932333
复制相似问题