Если добавить -Wl,--allow-multiple-definition -Wl,--whole-archive
опции в CMakeLists.txt. System.loadLibrary("~");
всегда вызывает ошибку SIGABRT. Ошибка: A/libc: Fatal signal 6 (SIGABRT) at 0x000036ae (code=-6), thread 13998
Я обнаружил, что эти сбои возникают на Galaxy Note 2, Galaxy s3 (Exynos 4 Quad 4412, ARM Cortex-A9 CPU, Android 4.4.2 Kitkat)
Создание новогопроект, используя Android Studio, шаблон проекта "Native C ++" и добавьте один строчный код ниже на CmakeLists.txt
.
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--allow-multiple-definition -Wl,--whole-archive")
Он всегда падает на System.loadLibrary("~");
строке.
Репозиторий кода на основе "Собственный шаблон C ++ ": https://github.com/kujyp/AndroidNativeWholeArchiveCrash
Версия NDK: 14.1.3816874
cat ~/Library/Android/sdk/ndk-bundle/source.properties
> Pkg.Desc = Android NDK
> Pkg.Revision = 14.1.3816874
При изменении версии ndk на 20 (20.1.5948944) возникает другая ошибка. Ошибка: java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libc++_shared.so" needed by "libnative-lib.so"; caused by library "libc++_shared.so" not found
Решено (но все еще вылетает в Galaxy Note 2): https://github.com/kujyp/AndroidNativeWholeArchiveCrash/commit/479c15918241e5c68621f27b22c1d56c6c9906ceЕсть какие-нибудь подсказки по причине? Или решение?
Фон:https://gist.github.com/kujyp/9c4c8c63cfd12f797639874d151b1707#file-with_tf1-4_cmakelists-txt
В моем проекте в качестве зависимости используется tenorflow-core.a (v1.4.0). Таким образом, без --allow-multiple-definition
или --whole-archive
библиотека tenorflow вызывает некоторые ошибки сборки. Так что мои параметры компилятора, параметры компоновщика такие же, как и в хранилище тензорного потока. опции: https://github.com/tensorflow/tensorflow/blob/v1.4.0/tensorflow/contrib/android/cmake/CMakeLists.txt#L45-L48
проблема с --whole-archive
опция: https://github.com/tensorflow/tensorflow/issues/4242
С библиотекой тензорного потока следует использовать gcc, а не clang в качестве инструмента сборки. С ndk 15 gcc устарела. (Начиная с tf1.13.1, clang использовался в качестве инструмента для сборки, но в моем проекте используется тензор потока 1.4.0 или 1.5.1 или 1.12.0)Версия NDK для тензорного потока: https://github.com/tensorflow/tensorflow/blob/v1.4.0/tensorflow/tools/ci_build/Dockerfile.android#L44