1 /* 2 * libjingle 3 * Copyright 2015 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include "talk/app/webrtc/test/androidtestinitializer.h" 29 30 #include <pthread.h> 31 32 // Note: this dependency is dangerous since it reaches into Chromium's base. 33 // There's a risk of e.g. macro clashes. This file may only be used in tests. 34 // Since we use Chromes build system for creating the gtest binary, this should 35 // be fine. 36 #include "base/android/context_utils.h" 37 #include "base/android/jni_android.h" 38 39 #include "talk/app/webrtc/java/jni/classreferenceholder.h" 40 #include "talk/app/webrtc/java/jni/jni_helpers.h" 41 #include "webrtc/base/checks.h" 42 #include "webrtc/base/ssladapter.h" 43 #include "webrtc/voice_engine/include/voe_base.h" 44 45 namespace webrtc { 46 47 namespace { 48 49 static pthread_once_t g_initialize_once = PTHREAD_ONCE_INIT; 50 51 // There can only be one JNI_OnLoad in each binary. So since this is a GTEST 52 // C++ runner binary, we want to initialize the same global objects we normally 53 // do if this had been a Java binary. 54 void EnsureInitializedOnce() { 55 RTC_CHECK(::base::android::IsVMInitialized()); 56 JNIEnv* jni = ::base::android::AttachCurrentThread(); 57 JavaVM* jvm = NULL; 58 RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm)); 59 jobject context = ::base::android::GetApplicationContext(); 60 61 RTC_CHECK_GE(webrtc_jni::InitGlobalJniVariables(jvm), 0); 62 RTC_CHECK(rtc::InitializeSSL()) << "Failed to InitializeSSL()"; 63 webrtc_jni::LoadGlobalClassReferenceHolder(); 64 65 webrtc::VoiceEngine::SetAndroidObjects(jvm, context); 66 } 67 68 } // anonymous namespace 69 70 void InitializeAndroidObjects() { 71 RTC_CHECK_EQ(0, pthread_once(&g_initialize_once, &EnsureInitializedOnce)); 72 } 73 74 } // namespace webrtc 75