| Index: base/android/jni_android.cc
|
| diff --git a/base/android/jni_android.cc b/base/android/jni_android.cc
|
| index 1b715dc7d544955ed5bc316d8808b6f35cd141fe..5416be32c2b1f430ed6cd531ce46d8cc438063a7 100644
|
| --- a/base/android/jni_android.cc
|
| +++ b/base/android/jni_android.cc
|
| @@ -28,52 +28,6 @@ base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> >::Leaky
|
| g_class_loader = LAZY_INSTANCE_INITIALIZER;
|
| jmethodID g_class_loader_load_class_method_id = 0;
|
|
|
| -std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) {
|
| - ScopedJavaLocalRef<jclass> throwable_clazz =
|
| - GetClass(env, "java/lang/Throwable");
|
| - jmethodID throwable_printstacktrace =
|
| - MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| - env, throwable_clazz.obj(), "printStackTrace",
|
| - "(Ljava/io/PrintStream;)V");
|
| -
|
| - // Create an instance of ByteArrayOutputStream.
|
| - ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz =
|
| - GetClass(env, "java/io/ByteArrayOutputStream");
|
| - jmethodID bytearray_output_stream_constructor =
|
| - MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| - env, bytearray_output_stream_clazz.obj(), "<init>", "()V");
|
| - jmethodID bytearray_output_stream_tostring =
|
| - MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| - env, bytearray_output_stream_clazz.obj(), "toString",
|
| - "()Ljava/lang/String;");
|
| - ScopedJavaLocalRef<jobject> bytearray_output_stream(env,
|
| - env->NewObject(bytearray_output_stream_clazz.obj(),
|
| - bytearray_output_stream_constructor));
|
| -
|
| - // Create an instance of PrintStream.
|
| - ScopedJavaLocalRef<jclass> printstream_clazz =
|
| - GetClass(env, "java/io/PrintStream");
|
| - jmethodID printstream_constructor =
|
| - MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| - env, printstream_clazz.obj(), "<init>",
|
| - "(Ljava/io/OutputStream;)V");
|
| - ScopedJavaLocalRef<jobject> printstream(env,
|
| - env->NewObject(printstream_clazz.obj(), printstream_constructor,
|
| - bytearray_output_stream.obj()));
|
| -
|
| - // Call Throwable.printStackTrace(PrintStream)
|
| - env->CallVoidMethod(java_throwable, throwable_printstacktrace,
|
| - printstream.obj());
|
| -
|
| - // Call ByteArrayOutputStream.toString()
|
| - ScopedJavaLocalRef<jstring> exception_string(
|
| - env, static_cast<jstring>(
|
| - env->CallObjectMethod(bytearray_output_stream.obj(),
|
| - bytearray_output_stream_tostring)));
|
| -
|
| - return ConvertJavaStringToUTF8(exception_string);
|
| -}
|
| -
|
| } // namespace
|
|
|
| namespace base {
|
| @@ -287,7 +241,7 @@ void CheckException(JNIEnv* env) {
|
|
|
| // Set the exception_string in BuildInfo so that breakpad can read it.
|
| // RVO should avoid any extra copies of the exception string.
|
| - base::android::BuildInfo::GetInstance()->set_java_exception_info(
|
| + base::android::BuildInfo::GetInstance()->SetJavaExceptionInfo(
|
| GetJavaExceptionInfo(env, java_throwable));
|
| }
|
|
|
| @@ -295,5 +249,52 @@ void CheckException(JNIEnv* env) {
|
| CHECK(false) << "Please include Java exception stack in crash report";
|
| }
|
|
|
| +std::string GetJavaExceptionInfo(JNIEnv* env, jthrowable java_throwable) {
|
| + ScopedJavaLocalRef<jclass> throwable_clazz =
|
| + GetClass(env, "java/lang/Throwable");
|
| + jmethodID throwable_printstacktrace =
|
| + MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| + env, throwable_clazz.obj(), "printStackTrace",
|
| + "(Ljava/io/PrintStream;)V");
|
| +
|
| + // Create an instance of ByteArrayOutputStream.
|
| + ScopedJavaLocalRef<jclass> bytearray_output_stream_clazz =
|
| + GetClass(env, "java/io/ByteArrayOutputStream");
|
| + jmethodID bytearray_output_stream_constructor =
|
| + MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| + env, bytearray_output_stream_clazz.obj(), "<init>", "()V");
|
| + jmethodID bytearray_output_stream_tostring =
|
| + MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| + env, bytearray_output_stream_clazz.obj(), "toString",
|
| + "()Ljava/lang/String;");
|
| + ScopedJavaLocalRef<jobject> bytearray_output_stream(env,
|
| + env->NewObject(bytearray_output_stream_clazz.obj(),
|
| + bytearray_output_stream_constructor));
|
| +
|
| + // Create an instance of PrintStream.
|
| + ScopedJavaLocalRef<jclass> printstream_clazz =
|
| + GetClass(env, "java/io/PrintStream");
|
| + jmethodID printstream_constructor =
|
| + MethodID::Get<MethodID::TYPE_INSTANCE>(
|
| + env, printstream_clazz.obj(), "<init>",
|
| + "(Ljava/io/OutputStream;)V");
|
| + ScopedJavaLocalRef<jobject> printstream(env,
|
| + env->NewObject(printstream_clazz.obj(), printstream_constructor,
|
| + bytearray_output_stream.obj()));
|
| +
|
| + // Call Throwable.printStackTrace(PrintStream)
|
| + env->CallVoidMethod(java_throwable, throwable_printstacktrace,
|
| + printstream.obj());
|
| +
|
| + // Call ByteArrayOutputStream.toString()
|
| + ScopedJavaLocalRef<jstring> exception_string(
|
| + env, static_cast<jstring>(
|
| + env->CallObjectMethod(bytearray_output_stream.obj(),
|
| + bytearray_output_stream_tostring)));
|
| +
|
| + return ConvertJavaStringToUTF8(exception_string);
|
| +}
|
| +
|
| +
|
| } // namespace android
|
| } // namespace base
|
|
|