OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/android/jni_android.h" | 5 #include "base/android/jni_android.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "base/android/build_info.h" | 9 #include "base/android/build_info.h" |
10 #include "base/android/jni_string.h" | 10 #include "base/android/jni_string.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 JavaVM* g_jvm = NULL; | 22 JavaVM* g_jvm = NULL; |
23 // Leak the global app context, as it is used from a non-joinable worker thread | 23 // Leak the global app context, as it is used from a non-joinable worker thread |
24 // that may still be running at shutdown. There is no harm in doing this. | 24 // that may still be running at shutdown. There is no harm in doing this. |
25 base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky | 25 base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky |
26 g_application_context = LAZY_INSTANCE_INITIALIZER; | 26 g_application_context = LAZY_INSTANCE_INITIALIZER; |
27 base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky | 27 base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky |
28 g_class_loader = LAZY_INSTANCE_INITIALIZER; | 28 g_class_loader = LAZY_INSTANCE_INITIALIZER; |
29 jmethodID g_class_loader_load_class_method_id = 0; | 29 jmethodID g_class_loader_load_class_method_id = 0; |
30 | 30 |
31 std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) { | |
32 ScopedJavaLocalRef<jclass> throwable_clazz = | |
33 GetClass(env, "java/lang/Throwable"); | |
34 jmethodID throwable_printstacktrace = | |
35 MethodID::Get<MethodID::TYPE_INSTANCE>( | |
36 env, throwable_clazz.obj(), "printStackTrace", | |
37 "(Ljava/io/PrintStream;)V"); | |
38 | |
39 // Create an instance of ByteArrayOutputStream. | |
40 ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz = | |
41 GetClass(env, "java/io/ByteArrayOutputStream"); | |
42 jmethodID bytearray_output_stream_constructor = | |
43 MethodID::Get<MethodID::TYPE_INSTANCE>( | |
44 env, bytearray_output_stream_clazz.obj(), "<init>", "()V"); | |
45 jmethodID bytearray_output_stream_tostring = | |
46 MethodID::Get<MethodID::TYPE_INSTANCE>( | |
47 env, bytearray_output_stream_clazz.obj(), "toString", | |
48 "()Ljava/lang/String;"); | |
49 ScopedJavaLocalRef<jobject> bytearray_output_stream(env, | |
50 env->NewObject(bytearray_output_stream_clazz.obj(), | |
51 bytearray_output_stream_constructor)); | |
52 | |
53 // Create an instance of PrintStream. | |
54 ScopedJavaLocalRef<jclass> printstream_clazz = | |
55 GetClass(env, "java/io/PrintStream"); | |
56 jmethodID printstream_constructor = | |
57 MethodID::Get<MethodID::TYPE_INSTANCE>( | |
58 env, printstream_clazz.obj(), "<init>", | |
59 "(Ljava/io/OutputStream;)V"); | |
60 ScopedJavaLocalRef<jobject> printstream(env, | |
61 env->NewObject(printstream_clazz.obj(), printstream_constructor, | |
62 bytearray_output_stream.obj())); | |
63 | |
64 // Call Throwable.printStackTrace(PrintStream) | |
65 env->CallVoidMethod(java_throwable, throwable_printstacktrace, | |
66 printstream.obj()); | |
67 | |
68 // Call ByteArrayOutputStream.toString() | |
69 ScopedJavaLocalRef<jstring> exception_string( | |
70 env, static_cast<jstring>( | |
71 env->CallObjectMethod(bytearray_output_stream.obj(), | |
72 bytearray_output_stream_tostring))); | |
73 | |
74 return ConvertJavaStringToUTF8(exception_string); | |
75 } | |
76 | |
77 } // namespace | 31 } // namespace |
78 | 32 |
79 namespace base { | 33 namespace base { |
80 namespace android { | 34 namespace android { |
81 | 35 |
82 bool IsManualJniRegistrationDisabled() { | 36 bool IsManualJniRegistrationDisabled() { |
83 return g_disable_manual_jni_registration; | 37 return g_disable_manual_jni_registration; |
84 } | 38 } |
85 | 39 |
86 void DisableManualJniRegistration() { | 40 void DisableManualJniRegistration() { |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 | 234 |
281 // Exception has been found, might as well tell breakpad about it. | 235 // Exception has been found, might as well tell breakpad about it. |
282 jthrowable java_throwable = env->ExceptionOccurred(); | 236 jthrowable java_throwable = env->ExceptionOccurred(); |
283 if (java_throwable) { | 237 if (java_throwable) { |
284 // Clear the pending exception, since a local reference is now held. | 238 // Clear the pending exception, since a local reference is now held. |
285 env->ExceptionDescribe(); | 239 env->ExceptionDescribe(); |
286 env->ExceptionClear(); | 240 env->ExceptionClear(); |
287 | 241 |
288 // Set the exception_string in BuildInfo so that breakpad can read it. | 242 // Set the exception_string in BuildInfo so that breakpad can read it. |
289 // RVO should avoid any extra copies of the exception string. | 243 // RVO should avoid any extra copies of the exception string. |
290 base::android::BuildInfo::GetInstance()->set_java_exception_info( | 244 base::android::BuildInfo::GetInstance()->SetJavaExceptionInfo( |
291 GetJavaExceptionInfo(env, java_throwable)); | 245 GetJavaExceptionInfo(env, java_throwable)); |
292 } | 246 } |
293 | 247 |
294 // Now, feel good about it and die. | 248 // Now, feel good about it and die. |
295 CHECK(false) << "Please include Java exception stack in crash report"; | 249 CHECK(false) << "Please include Java exception stack in crash report"; |
296 } | 250 } |
297 | 251 |
| 252 std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) { |
| 253 ScopedJavaLocalRef<jclass> throwable_clazz = |
| 254 GetClass(env, "java/lang/Throwable"); |
| 255 jmethodID throwable_printstacktrace = |
| 256 MethodID::Get<MethodID::TYPE_INSTANCE>( |
| 257 env, throwable_clazz.obj(), "printStackTrace", |
| 258 "(Ljava/io/PrintStream;)V"); |
| 259 |
| 260 // Create an instance of ByteArrayOutputStream. |
| 261 ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz = |
| 262 GetClass(env, "java/io/ByteArrayOutputStream"); |
| 263 jmethodID bytearray_output_stream_constructor = |
| 264 MethodID::Get<MethodID::TYPE_INSTANCE>( |
| 265 env, bytearray_output_stream_clazz.obj(), "<init>", "()V"); |
| 266 jmethodID bytearray_output_stream_tostring = |
| 267 MethodID::Get<MethodID::TYPE_INSTANCE>( |
| 268 env, bytearray_output_stream_clazz.obj(), "toString", |
| 269 "()Ljava/lang/String;"); |
| 270 ScopedJavaLocalRef<jobject> bytearray_output_stream(env, |
| 271 env->NewObject(bytearray_output_stream_clazz.obj(), |
| 272 bytearray_output_stream_constructor)); |
| 273 |
| 274 // Create an instance of PrintStream. |
| 275 ScopedJavaLocalRef<jclass> printstream_clazz = |
| 276 GetClass(env, "java/io/PrintStream"); |
| 277 jmethodID printstream_constructor = |
| 278 MethodID::Get<MethodID::TYPE_INSTANCE>( |
| 279 env, printstream_clazz.obj(), "<init>", |
| 280 "(Ljava/io/OutputStream;)V"); |
| 281 ScopedJavaLocalRef<jobject> printstream(env, |
| 282 env->NewObject(printstream_clazz.obj(), printstream_constructor, |
| 283 bytearray_output_stream.obj())); |
| 284 |
| 285 // Call Throwable.printStackTrace(PrintStream) |
| 286 env->CallVoidMethod(java_throwable, throwable_printstacktrace, |
| 287 printstream.obj()); |
| 288 |
| 289 // Call ByteArrayOutputStream.toString() |
| 290 ScopedJavaLocalRef<jstring> exception_string( |
| 291 env, static_cast<jstring>( |
| 292 env->CallObjectMethod(bytearray_output_stream.obj(), |
| 293 bytearray_output_stream_tostring))); |
| 294 |
| 295 return ConvertJavaStringToUTF8(exception_string); |
| 296 } |
| 297 |
| 298 |
298 } // namespace android | 299 } // namespace android |
299 } // namespace base | 300 } // namespace base |
OLD | NEW |