OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <android/log.h> | 11 #include <android/log.h> |
12 | 12 |
| 13 #include <memory> |
| 14 |
13 #include "webrtc/modules/utility/include/jvm_android.h" | 15 #include "webrtc/modules/utility/include/jvm_android.h" |
14 | 16 |
15 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
16 | 18 |
17 #define TAG "JVM" | 19 #define TAG "JVM" |
18 #define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) | 20 #define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) |
19 #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) | 21 #define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) |
20 | 22 |
21 namespace webrtc { | 23 namespace webrtc { |
22 | 24 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 : JavaClass(jni, clazz), jni_(jni) { | 134 : JavaClass(jni, clazz), jni_(jni) { |
133 ALOGD("NativeRegistration::ctor%s", GetThreadInfo().c_str()); | 135 ALOGD("NativeRegistration::ctor%s", GetThreadInfo().c_str()); |
134 } | 136 } |
135 | 137 |
136 NativeRegistration::~NativeRegistration() { | 138 NativeRegistration::~NativeRegistration() { |
137 ALOGD("NativeRegistration::dtor%s", GetThreadInfo().c_str()); | 139 ALOGD("NativeRegistration::dtor%s", GetThreadInfo().c_str()); |
138 jni_->UnregisterNatives(j_class_); | 140 jni_->UnregisterNatives(j_class_); |
139 CHECK_EXCEPTION(jni_) << "Error during UnregisterNatives"; | 141 CHECK_EXCEPTION(jni_) << "Error during UnregisterNatives"; |
140 } | 142 } |
141 | 143 |
142 rtc::scoped_ptr<GlobalRef> NativeRegistration::NewObject( | 144 std::unique_ptr<GlobalRef> NativeRegistration::NewObject( |
143 const char* name, const char* signature, ...) { | 145 const char* name, const char* signature, ...) { |
144 ALOGD("NativeRegistration::NewObject%s", GetThreadInfo().c_str()); | 146 ALOGD("NativeRegistration::NewObject%s", GetThreadInfo().c_str()); |
145 va_list args; | 147 va_list args; |
146 va_start(args, signature); | 148 va_start(args, signature); |
147 jobject obj = jni_->NewObjectV(j_class_, | 149 jobject obj = jni_->NewObjectV(j_class_, |
148 GetMethodID(jni_, j_class_, name, signature), | 150 GetMethodID(jni_, j_class_, name, signature), |
149 args); | 151 args); |
150 CHECK_EXCEPTION(jni_) << "Error during NewObjectV"; | 152 CHECK_EXCEPTION(jni_) << "Error during NewObjectV"; |
151 va_end(args); | 153 va_end(args); |
152 return rtc::scoped_ptr<GlobalRef>(new GlobalRef(jni_, obj)); | 154 return std::unique_ptr<GlobalRef>(new GlobalRef(jni_, obj)); |
153 } | 155 } |
154 | 156 |
155 // JavaClass implementation. | 157 // JavaClass implementation. |
156 jmethodID JavaClass::GetMethodId( | 158 jmethodID JavaClass::GetMethodId( |
157 const char* name, const char* signature) { | 159 const char* name, const char* signature) { |
158 return GetMethodID(jni_, j_class_, name, signature); | 160 return GetMethodID(jni_, j_class_, name, signature); |
159 } | 161 } |
160 | 162 |
161 jmethodID JavaClass::GetStaticMethodId( | 163 jmethodID JavaClass::GetStaticMethodId( |
162 const char* name, const char* signature) { | 164 const char* name, const char* signature) { |
(...skipping 11 matching lines...) Expand all Loading... |
174 // JNIEnvironment implementation. | 176 // JNIEnvironment implementation. |
175 JNIEnvironment::JNIEnvironment(JNIEnv* jni) : jni_(jni) { | 177 JNIEnvironment::JNIEnvironment(JNIEnv* jni) : jni_(jni) { |
176 ALOGD("JNIEnvironment::ctor%s", GetThreadInfo().c_str()); | 178 ALOGD("JNIEnvironment::ctor%s", GetThreadInfo().c_str()); |
177 } | 179 } |
178 | 180 |
179 JNIEnvironment::~JNIEnvironment() { | 181 JNIEnvironment::~JNIEnvironment() { |
180 ALOGD("JNIEnvironment::dtor%s", GetThreadInfo().c_str()); | 182 ALOGD("JNIEnvironment::dtor%s", GetThreadInfo().c_str()); |
181 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 183 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
182 } | 184 } |
183 | 185 |
184 rtc::scoped_ptr<NativeRegistration> JNIEnvironment::RegisterNatives( | 186 std::unique_ptr<NativeRegistration> JNIEnvironment::RegisterNatives( |
185 const char* name, const JNINativeMethod *methods, int num_methods) { | 187 const char* name, const JNINativeMethod *methods, int num_methods) { |
186 ALOGD("JNIEnvironment::RegisterNatives(%s)", name); | 188 ALOGD("JNIEnvironment::RegisterNatives(%s)", name); |
187 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 189 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
188 jclass clazz = LookUpClass(name); | 190 jclass clazz = LookUpClass(name); |
189 jni_->RegisterNatives(clazz, methods, num_methods); | 191 jni_->RegisterNatives(clazz, methods, num_methods); |
190 CHECK_EXCEPTION(jni_) << "Error during RegisterNatives"; | 192 CHECK_EXCEPTION(jni_) << "Error during RegisterNatives"; |
191 return rtc::scoped_ptr<NativeRegistration>( | 193 return std::unique_ptr<NativeRegistration>( |
192 new NativeRegistration(jni_, clazz)); | 194 new NativeRegistration(jni_, clazz)); |
193 } | 195 } |
194 | 196 |
195 std::string JNIEnvironment::JavaToStdString(const jstring& j_string) { | 197 std::string JNIEnvironment::JavaToStdString(const jstring& j_string) { |
196 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 198 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
197 const char* jchars = jni_->GetStringUTFChars(j_string, nullptr); | 199 const char* jchars = jni_->GetStringUTFChars(j_string, nullptr); |
198 CHECK_EXCEPTION(jni_); | 200 CHECK_EXCEPTION(jni_); |
199 const int size = jni_->GetStringUTFLength(j_string); | 201 const int size = jni_->GetStringUTFLength(j_string); |
200 CHECK_EXCEPTION(jni_); | 202 CHECK_EXCEPTION(jni_); |
201 std::string ret(jchars, size); | 203 std::string ret(jchars, size); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 LoadClasses(jni()); | 235 LoadClasses(jni()); |
234 } | 236 } |
235 | 237 |
236 JVM::~JVM() { | 238 JVM::~JVM() { |
237 ALOGD("JVM::~JVM%s", GetThreadInfo().c_str()); | 239 ALOGD("JVM::~JVM%s", GetThreadInfo().c_str()); |
238 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 240 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
239 FreeClassReferences(jni()); | 241 FreeClassReferences(jni()); |
240 DeleteGlobalRef(jni(), context_); | 242 DeleteGlobalRef(jni(), context_); |
241 } | 243 } |
242 | 244 |
243 rtc::scoped_ptr<JNIEnvironment> JVM::environment() { | 245 std::unique_ptr<JNIEnvironment> JVM::environment() { |
244 ALOGD("JVM::environment%s", GetThreadInfo().c_str()); | 246 ALOGD("JVM::environment%s", GetThreadInfo().c_str()); |
245 // The JNIEnv is used for thread-local storage. For this reason, we cannot | 247 // The JNIEnv is used for thread-local storage. For this reason, we cannot |
246 // share a JNIEnv between threads. If a piece of code has no other way to get | 248 // share a JNIEnv between threads. If a piece of code has no other way to get |
247 // its JNIEnv, we should share the JavaVM, and use GetEnv to discover the | 249 // its JNIEnv, we should share the JavaVM, and use GetEnv to discover the |
248 // thread's JNIEnv. (Assuming it has one, if not, use AttachCurrentThread). | 250 // thread's JNIEnv. (Assuming it has one, if not, use AttachCurrentThread). |
249 // See // http://developer.android.com/training/articles/perf-jni.html. | 251 // See // http://developer.android.com/training/articles/perf-jni.html. |
250 JNIEnv* jni = GetEnv(jvm_); | 252 JNIEnv* jni = GetEnv(jvm_); |
251 if (!jni) { | 253 if (!jni) { |
252 ALOGE("AttachCurrentThread() has not been called on this thread."); | 254 ALOGE("AttachCurrentThread() has not been called on this thread."); |
253 return rtc::scoped_ptr<JNIEnvironment>(); | 255 return std::unique_ptr<JNIEnvironment>(); |
254 } | 256 } |
255 return rtc::scoped_ptr<JNIEnvironment>(new JNIEnvironment(jni)); | 257 return std::unique_ptr<JNIEnvironment>(new JNIEnvironment(jni)); |
256 } | 258 } |
257 | 259 |
258 JavaClass JVM::GetClass(const char* name) { | 260 JavaClass JVM::GetClass(const char* name) { |
259 ALOGD("JVM::GetClass(%s)%s", name, GetThreadInfo().c_str()); | 261 ALOGD("JVM::GetClass(%s)%s", name, GetThreadInfo().c_str()); |
260 RTC_DCHECK(thread_checker_.CalledOnValidThread()); | 262 RTC_DCHECK(thread_checker_.CalledOnValidThread()); |
261 return JavaClass(jni(), LookUpClass(name)); | 263 return JavaClass(jni(), LookUpClass(name)); |
262 } | 264 } |
263 | 265 |
264 } // namespace webrtc | 266 } // namespace webrtc |
OLD | NEW |