无法在Android上创建org.webrtc.voiceengine.WebRtcAudioManager



我在Windows中有一个本机(c++) WebRTC的功能实现,我现在正试图在每个其他平台上工作。目前,我正在攻击Android。

当我调用webrtc::CreatePeerConnectionFactory时,它不能创建java类org.webrtc.voiceengine.WebRtcAudioManager。我得到以下结果(随后崩溃!):

I audio_processing_impl.cc: (line 292): Injected APM submodules:
I audio_processing_impl.cc: Echo control factory: 0
I audio_processing_impl.cc: Echo detector: 0
I audio_processing_impl.cc: Capture analyzer: 0
I audio_processing_impl.cc: Capture post processor: 0
I audio_processing_impl.cc: Render pre processor: 0
I audio_processing_impl.cc: (line 301): Denormal disabler: supported
I webrtc_voice_engine.cc: (line 312): WebRtcVoiceEngine::WebRtcVoiceEngine
I webrtc_video_engine.cc: (line 648): WebRtcVideoEngine::WebRtcVideoEngine()
I webrtc_voice_engine.cc: (line 334): WebRtcVoiceEngine::Init
I audio_device_impl.cc: (line 76): Create
I audio_device_impl.cc: (line 84): CreateForTest
I audio_device_buffer.cc: (line 65): AudioDeviceBuffer::ctor
I audio_device_impl.cc: (line 121): AudioDeviceModuleImpl
I audio_device_impl.cc: (line 125): CheckPlatform
I audio_device_impl.cc: (line 133): current platform is Android
I audio_device_impl.cc: (line 155): CreatePlatformSpecificObjects
I audio_device_impl.cc: (line 947): PlatformAudioLayer
I jvm_android.cc: (line 72): JvmThreadConnector::ctor
I jvm_android.cc: (line 77): Attaching thread to JVM
I jvm_android.cc: (line 262): JVM::environment
I jvm_android.cc: (line 184): JNIEnvironment::ctor
I audio_manager.cc: (line 71): ctor
I jvm_android.cc: (line 196): JNIEnvironment::RegisterNatives: org/webrtc/voiceengine/WebRtcAudioManager
I jvm_android.cc: (line 134): NativeRegistration::ctor
I jvm_android.cc: (line 146): NativeRegistration::NewObject
I org.webrtc.Logging: WebRtcAudioManager: ctor@[name=Thread-15, id=21131]
W System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
W System.err:   at org.webrtc.voiceengine.WebRtcAudioManager.<init>(WebRtcAudioManager.java:176)
E rtc     : #
E rtc     : # Fatal error in: ../../modules/utility/source/jvm_android.cc, line 151
E rtc     : # last system error: 0
E rtc     : # Check failed: !jni_->ExceptionCheck()
E rtc     : # Error during NewObjectV
F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 28384 (Thread-15), pid 27615 (.qgroundcontrol)

这就是失败的Java行:

audioManager =
(AudioManager) ContextUtils.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);

我使用的是WebRTC M103 (branch-heads/5060)。

我已经链接到libwebrtc.a,动态加载libjingle_peerconnection_so.so,绑定libwebrtc.jar。所有这些似乎都是必需的依赖关系,当我将它们添加到等式中时,它们为我一个接一个地推进了球。

修复!这就是我失踪了:

我在webrtc::CreatePeerConnectionFactory之前调用了webrtc::JVM::Initialize(这是许多Droid特定要求之一,他们在任何文档中都没有提到…)。但是,我忽略了一个事实,即有一个过载,它采取Droid应用程序上下文(即static void Initialize(JavaVM* jvm, jobject context);)。也就是说,我只是在初始化时传递了jvm指针。

经过一个小冒险(我将省略细节),在C端获得context参考,而不是让它"过时"。(当Java GC将其删除时),我将其传递给初始化。这反过来又使ContextUtils.getApplicationContext()的Java调用(原始问题)能够工作!

最新更新