diff --git a/cxx/fbjni/detail/Exceptions.cpp b/cxx/fbjni/detail/Exceptions.cpp index 2b0e211..db65d9e 100644 --- a/cxx/fbjni/detail/Exceptions.cpp +++ b/cxx/fbjni/detail/Exceptions.cpp @@ -427,7 +427,13 @@ local_ref JniException::getThrowable() const noexcept { void JniException::populateWhat() const noexcept { try { ThreadScope ts; - what_ = throwable_->toString(); + static auto exceptionHelperClass = + findClassStatic("com/facebook/jni/ExceptionHelper"); + static auto getErrorDescriptionMethod = + exceptionHelperClass->getStaticMethod( + "getErrorDescription"); + what_ = getErrorDescriptionMethod(exceptionHelperClass, throwable_.get()) + ->toStdString(); isMessageExtracted_ = true; } catch (...) { what_ = kExceptionMessageFailure; diff --git a/java/com/facebook/jni/ExceptionHelper.java b/java/com/facebook/jni/ExceptionHelper.java new file mode 100644 index 0000000..29b18ae --- /dev/null +++ b/java/com/facebook/jni/ExceptionHelper.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.facebook.jni; + +import com.facebook.jni.annotations.DoNotStrip; +import java.io.PrintWriter; +import java.io.StringWriter; + +@DoNotStrip +class ExceptionHelper { + @DoNotStrip + private static String getErrorDescription(Throwable throwable) { + final StringWriter stringWriter = new StringWriter(); + throwable.printStackTrace(new PrintWriter(stringWriter)); + return stringWriter.toString(); + } +} diff --git a/test/FBJniTests.java b/test/FBJniTests.java index 0e38bc8..1e77d81 100644 --- a/test/FBJniTests.java +++ b/test/FBJniTests.java @@ -639,7 +639,13 @@ public void testHandleNoRttiException() { @Test public void testCopyConstructor() { assertThat(nativeTestCopyConstructor()) - .isEqualTo("com.facebook.jni.FBJniTests$CustomException: getMessages: 1"); + .startsWith( + "com.facebook.jni.FBJniTests$CustomException: getMessages: 1\n" + + "\tat com.facebook.jni.FBJniTests.customExceptionThrower(FBJniTests.java:") + .contains( + ")\n" + + "\tat com.facebook.jni.FBJniTests.nativeTestCopyConstructor(Native Method)\n" + + "\tat com.facebook.jni.FBJniTests.testCopyConstructor(FBJniTests.java:"); } private native String nativeTestCopyConstructor(); @@ -647,7 +653,14 @@ public void testCopyConstructor() { @Test public void testMoveConstructorWithEmptyWhat() { assertThat(nativeTestMoveConstructorWithEmptyWhat()) - .isEqualTo("com.facebook.jni.FBJniTests$CustomException: getMessages: 1"); + .startsWith( + "com.facebook.jni.FBJniTests$CustomException: getMessages: 1\n" + + "\tat com.facebook.jni.FBJniTests.customExceptionThrower(FBJniTests.java:") + .contains( + ")\n" + + "\tat com.facebook.jni.FBJniTests.nativeTestMoveConstructorWithEmptyWhat(Native" + + " Method)\n" + + "\tat com.facebook.jni.FBJniTests.testMoveConstructorWithEmptyWhat(FBJniTests.java:"); } private native String nativeTestMoveConstructorWithEmptyWhat(); @@ -655,7 +668,14 @@ public void testMoveConstructorWithEmptyWhat() { @Test public void testMoveConstructorWithPopulatedWhat() { assertThat(nativeTestMoveConstructorWithPopulatedWhat()) - .isEqualTo("com.facebook.jni.FBJniTests$CustomException: getMessages: 1"); + .startsWith( + "com.facebook.jni.FBJniTests$CustomException: getMessages: 1\n" + + "\tat com.facebook.jni.FBJniTests.customExceptionThrower(FBJniTests.java:") + .contains( + ")\n" + + "\tat com.facebook.jni.FBJniTests.nativeTestMoveConstructorWithPopulatedWhat(Native" + + " Method)\n" + + "\tat com.facebook.jni.FBJniTests.testMoveConstructorWithPopulatedWhat(FBJniTests.java:"); } private native String nativeTestMoveConstructorWithPopulatedWhat();