Android:当抛出异常时,链接到opencv会导致SIGBUS(信号SIGBUS:非法对齐)

Android:当抛出异常时,链接到opencv会导致SIGBUS(信号SIGBUS:非法对齐),opencv,android-ndk,clang,c++17,Opencv,Android Ndk,Clang,C++17,我必须在android项目中使用opencv。直到最近我还必须使用C++异常PPTR,一切都很好。 此后,使用std::rethrow_exception会导致SIGBUS(信号SIGBUS:非法对齐) 我创建了一个简单的示例来说明这个问题。示例应用程序仅链接到opencv 3.4.4,但不使用任何opencv函数。如果在CMakeLists.txt中删除指向opencv的链接,应用程序工作正常,不会崩溃。但是,如果您添加它,一旦调用本机方法triggerException(),应用程序就会崩溃

我必须在android项目中使用opencv。直到最近我还必须使用C++异常PPTR,一切都很好。 此后,使用
std::rethrow_exception
会导致SIGBUS(信号SIGBUS:非法对齐)

我创建了一个简单的示例来说明这个问题。示例应用程序仅链接到opencv 3.4.4,但不使用任何opencv函数。如果在
CMakeLists.txt
中删除指向opencv的链接,应用程序工作正常,不会崩溃。但是,如果您添加它,一旦调用本机方法
triggerException()
,应用程序就会崩溃。 在我的实现中,如果按下按钮,示例应用程序将调用此方法

本机lib.cpp:

Stacktrace:

<unknown> 0x004c4e47432b2b01
___lldb_unnamed_symbol15856$$libopencv_java3.so 0x0000007f811c4a58
_Unwind_Resume_or_Rethrow 0x0000007f811c4fc8
__cxa_rethrow 0x0000007f81181e50
__gnu_cxx::__verbose_terminate_handler() 0x0000007f811b1580
__cxxabiv1::__terminate(void (*)()) 0x0000007f81181c54
std::terminate() 0x0000007f81181cc0
std::rethrow_exception(std::exception_ptr) 0x0000007f802db2cc
handle_eptr2(std::exception_ptr) native-lib.cpp:35
::Java_com_example_user_exceptiontest_MainActivity_triggerException(JNIEnv *, jobject) native-lib.cpp:58
0x004c4e47432b2b01
___lldb_未命名_symbol15856$$libopencv_java3.so 0x0000007f811c4a58
_展开\u恢复\u或重新缩回0x0000007f811c4fc8
__cxa_返回0x0000007f81181e50
__gnu\U cxx::\u详细\u终止\u处理程序()0x0000007f811b1580
__cxxabiv1::u终止(无效(*)()0x0000007f81181c54
std::terminate()0x0000007f81181cc0
std::rethrow_异常(std::exception_ptr)0x0000007f802db2cc
handle_eptr2(std::exception_ptr)本机lib.cpp:35
::Java_com_example_user_exceptiontest_main activity_triggerException(JNIEnv*,jobject)本机lib.cpp:58
在搜索解决方案时,我查看了opencv源代码()并偶然发现了以下代码片段:

#ifndef CV__EXCEPTION_PTR
#  if defined(__ANDROID__) && defined(ATOMIC_INT_LOCK_FREE) && ATOMIC_INT_LOCK_FREE < 2
# define CV__EXCEPTION_PTR 0  // Not supported, details: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58938
\ifndef CV\uu异常\uu PTR
#如果已定义(uuu ANDROID_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#定义CV\u异常\u PTR 0//不受支持,详细信息:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58938
我理解这是否会改变opencv的行为,但我不知道这会如何影响根本不使用opencv的代码

编辑:还值得一提的是,如果我在linux(x86_64)桌面设置(clang、libc++、opencv3.4.4)中直接使用此代码(不使用jni),那么链接到opencv不会产生任何影响。因此,我的结论是这是一个android特有的问题

有没有人知道如何解决这个问题,或者下一步该做什么?
提前多谢 cmake-GNinja-DINSTALL_ANDROID_EXAMPLES=ON -DANDROID_EXAMPLES_WITH_LIBS=ON-DBUILD_EXAMPLES=ON-DBUILD_DOCS=OFF-DWITH_OPENCL=OFF-DWITH_IPP=ON-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/ANDROID.TOOLCHAIN.cmake -DANDROID_TOOLCHAIN=clang“-DANDROID_STL=c++\u static”-DANDROID_ABI=x86-DANDROID_SDK_TARGET=18../opencv

制作和制作安装(&M)


在使用C++ STL的时候,用GNU运行时编译OpenCV。看见您将需要使用GNUSTL(您需要返回NDK 15),或者用C++ STL构建OpenCV。我用了相当长的时间用C++ STL构建OpenCV,但是现在它正在工作。我不明白为什么我的台式电脑没有问题。如果你愿意的话。您可以将您的评论作为答案发布。再次感谢
externalNativeBuild {
    cmake {
        arguments '-DANDROID_TOOLCHAIN=clang',
                  '-DANDROID_STL=c++_shared'
        cppFlags "-std=c++1z -frtti -fexceptions"
    }
}
<unknown> 0x004c4e47432b2b01
___lldb_unnamed_symbol15856$$libopencv_java3.so 0x0000007f811c4a58
_Unwind_Resume_or_Rethrow 0x0000007f811c4fc8
__cxa_rethrow 0x0000007f81181e50
__gnu_cxx::__verbose_terminate_handler() 0x0000007f811b1580
__cxxabiv1::__terminate(void (*)()) 0x0000007f81181c54
std::terminate() 0x0000007f81181cc0
std::rethrow_exception(std::exception_ptr) 0x0000007f802db2cc
handle_eptr2(std::exception_ptr) native-lib.cpp:35
::Java_com_example_user_exceptiontest_MainActivity_triggerException(JNIEnv *, jobject) native-lib.cpp:58
#ifndef CV__EXCEPTION_PTR
#  if defined(__ANDROID__) && defined(ATOMIC_INT_LOCK_FREE) && ATOMIC_INT_LOCK_FREE < 2
# define CV__EXCEPTION_PTR 0  // Not supported, details: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58938