我在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调用(原始问题)能够工作!