Android C ++ вызывает исключение SIGSEGV - PullRequest
0 голосов
/ 24 января 2019

Я столкнулся с некоторыми проблемами при интеграции кода C ++ в мое приложение для Android.Я использовал библиотеку Djinni для генерации кода JNI, который я использую в приложении.Я использую CMake для создания своей библиотеки C ++, и я связываю библиотеку OpenCV (с файлами .so) в процессе.Я использую NDK r19.

У меня есть класс C ++, интегрированный в проект, который может генерировать исключение std::runtime_error, но у этого исключения есть поведение, которое я не понимаю.

Первая проблема:

Я посмотрел здесь документ https://developer.android.com/ndk/guides/cmake и использовал атрибут -DANDROID_CPP_FEATURES=rtti exceptions, чтобы включить исключения C ++.При этом, как только мое исключение выдается в C ++, я получаю SIGABRT, который вызывает сбой моего приложения.Это происходит, даже если бросок в C ++ окружен блоком catch(...).Я также попытался применить флаги -fexceptions и -frtti - cppFlags, но безуспешно.

Вторая проблема:

Я использовал другой STL с атрибутом -DANDROID_STL и поставилэто к c++_shared.С этим атрибутом мои исключения правильно обрабатываются на некоторых архитектурах.Но на архитектуре armv7l (найденной с использованием System.getProperty("os.arch")), выброс вызывает SIGSEGV, что приводит к сбою моего приложения.

Здесь раздел android моего build.gradle файла:

android {
    compileSdkVersion Versions.COMPILE_SDK
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion Versions.MIN_SDK
        targetSdkVersion Versions.TARGET_SDK
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                cppFlags "-v"
                arguments "-DANDROID_CPP_FEATURES=rtti exceptions", "-DANDROID_STL=c++_shared"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets {
        main.jniLibs.srcDirs += 'src/main/jniLibs'
    }
}

Вот мой CMakeLists.txt файл:

# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html

# Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.4.1)

# Library name
set(library_name native-lib)

# Path to djinni support code
set(support_dir src/djinni/support-lib/jni)
# Path to generated code and own c++ implementation
set(include_dirs src/djinni/generated/jni src/djinni/generated/cpp src/main/cpp)

# Djinni support code that needs to be compiled
file(
        GLOB_RECURSE support_srcs
        ${support_dir}/*.cpp)

# Generated code and c++ implementations that needs to be compiled
file(
        GLOB_RECURSE lib_srcs
        src/djinni/generated/cpp/*.cpp
        src/djinni/generated/jni/*.cpp
        src/main/cpp/*.cpp)


# All the implementation files that make up our library
set(complete_srcs ${support_srcs} ${lib_srcs})

# Define library referring to the sources above
add_library(${library_name} SHARED ${complete_srcs})


# Add OpenCV library
set(opencv_library_name opencv)
set(opencv_dir src/main/jniLibs/${CMAKE_ANDROID_ARCH_ABI})

add_library(${opencv_library_name} SHARED IMPORTED)
set_target_properties(${opencv_library_name} PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/${opencv_dir}/libopencv_java3.so)

# We link opencv to our datamatrix library
target_link_libraries(${library_name} ${opencv_library_name})

# Define INCLUDE DIRECTORIES property for native-lib
target_include_directories(${library_name} PUBLIC ${include_dirs} ${support_dir})

Вот командное зданиеодин файл C ++ во время процесса сборки моего приложения (найден с использованием -v в cppFlags):

 "/Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" -cc1 -triple i686-none-linux-android21 -emit-obj -mrelax-all -mnoexecstack -disable-free -disable-llvm-verifier -discard-value-names -main-file-name usercodedecoder.cpp -mrelocation-model pic -pic-level 2 -mthread-model posix -mdisable-fp-elim -fmath-errno -masm-verbose -mconstructor-aliases -munwind-tables -fuse-init-array -target-cpu i686 -target-feature +ssse3 -dwarf-column-info -debug-info-kind=standalone -dwarf-version=4 -debugger-tuning=gdb -target-linker-version 241.9 -v -ffunction-sections -fdata-sections -coverage-notes-file /Users/me/Documents/workspace/my_project/app/.externalNativeBuild/cmake/debug/x86/CMakeFiles/native-lib.dir/src/main/cpp/usercodedecoder.cpp.gcno -resource-dir /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/8.0.2 -dependency-file CMakeFiles/native-lib.dir/src/main/cpp/usercodedecoder.cpp.o.d -sys-header-deps -MT CMakeFiles/native-lib.dir/src/main/cpp/usercodedecoder.cpp.o -D datamatrix_native_lib_EXPORTS -I ../../../../src/djinni/generated/jni -I ../../../../src/djinni/generated/cpp -I ../../../../src/main/cpp -I ../../../../src/djinni/support-lib/jni -D ANDROID -isysroot /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot -internal-isystem /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1 -internal-isystem /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/local/include -internal-isystem /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/lib64/clang/8.0.2/include -internal-externc-isystem /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/i686-linux-android -internal-externc-isystem /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/include -internal-externc-isystem /Users/me/Library/Android/sdk/ndk-bundle/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include -O0 -Wformat -Werror=format-security -fdeprecated-macro -fdebug-compilation-dir /Users/me/Documents/workspace/my_project/app/.externalNativeBuild/cmake/debug/x86 -ferror-limit 19 -fmessage-length 0 -stack-protector 2 -mstackrealign -fobjc-runtime=gcc -fcxx-exceptions -fexceptions -fdiagnostics-show-option -o CMakeFiles/native-lib.dir/src/main/cpp/usercodedecoder.cpp.o -x c++ ../../../../src/main/cpp/usercodedecoder.cpp

Я провел некоторое исследование по поводу таких проблем, но не смог найти что-то, что помоглоя могу удалить эту ошибку SIGSEGV на некоторых архитектурах.

Я полагаю, что проблема в моем процессе сборки, но я не могу понять, что делать, чтобы ее решить.

1 Ответ

0 голосов
/ 24 января 2019

opencv, вероятно, был построен неправильно. См. https://github.com/android-ndk/ndk/issues/889 для инструкций по диагностике этого. Просто сделайте то же самое для вашей библиотеки opencv, как предлагает эта ошибка для qt.

...