Android NDK - статическая библиотека не смогла связаться - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть скрипт для создания статической библиотеки для Android. Я использовал его около года назад без проблем. Однако, когда я сейчас создаю библиотеку с использованием точно такого же сценария и использую ее в своем проекте, как и раньше, я получаю много ошибок компоновщика, которые выглядят так:

C: /Users/Perry/AppData/Local/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/ .. /../../../i686-linux-android/bin\ld: ошибка: ../../../../../../External_libs_android/libs/icu/jni/x86/libicuuc.a(chariter.ao): перемещение R_386_GOTOFF против вытесняемого символа _ZTVN3icu17CharacterIteratorE нельзя использовать при создании общего объекта

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

У меня есть NDK 18.1.5063045

EDIT:

Если я переключился обратно на NDK 16, все работает правильно

Для сборки Android из статической библиотеки я использую следующие сценарии (источник: https://github.com/MartinPerry/icu-build-scripts)

prefix.sh

export ICU_VERSION="60-2"

export BASE_ICU_DIR="/Users/perry/Development/icu-cross-compile-master"

export ICU_DIR="${BASE_ICU_DIR}/icu-${ICU_VERSION}"

export ICU_SOURCE="${ICU_DIR}/source"

export PREBUILD="${BASE_ICU_DIR}/scripts/mac/icu_build"

export NDK_STANDALONE_TOOLCHAIN_ROOT="${BASE_ICU_DIR}/scripts/android/toolchains"

export ANDROID_NDK="/Users/perry/Library/Android/sdk/ndk-bundle"

export CONFIG_PREFIX=" --enable-extras=yes \
--enable-tools=yes \
--enable-icuio=yes \
--enable-strict=no \
--enable-static \
--enable-shared=no \
--enable-tests=yes \
--disable-renaming \
--enable-samples=no \
--enable-dyload=no \
--with-data-packaging=static"

export CFLAGS="-O3 -D__STDC_INT64__ -fno-exceptions -fno-short-wchar -fno-short-enums"

export CXXFLAGS="${CFLAGS} -std=c++11"

#will set value to 1
defines_config_set_1=( \
"UCONFIG_NO_COLLATION" \
"UCONFIG_NO_LEGACY_CONVERSION" \
"UCONFIG_NO_BREAK_ITERATION" \
"UCONFIG_NO_COLLATION" \
"UCONFIG_NO_FORMATTING" \
"UCONFIG_NO_REGULAR_EXPRESSIONS" \
"UCONFIG_NO_LEGACY_CONVERSION" \
"CONFIG_NO_CONVERSION" \
"U_DISABLE_RENAMING" \
)

#will set value to 0
defines_config_set_0=( \
"U_HAVE_NL_LANGINFO_CODESET" \
"UCONFIG_NO_TRANSLITERATION" \
"U_USING_ICU_NAMESPACE" \
)

#will set value to 1
defines_utypes=( \
"U_CHARSET_IS_UTF8" \
)

build.sh

#!/bin/bash

source "../prefix.sh"



function build {
# $1: Toolchain Name
# $2: Toolchain architecture
# $3: Android arch
# $4: host for configure
# $5: additional CPP flags

echo "preparing $1 toolchain"

export PLATFORM_PREFIX=${PWD}/$2-toolchain
export BUILD_DIR=${PWD}/build-$2

#https://developer.android.com/ndk/guides/standalone_toolchain.html
$ANDROID_NDK/build/tools/make_standalone_toolchain.py \
   --api=26 \
   --install-dir=$PLATFORM_PREFIX \
   --stl=libc++ \
   --arch=$3

export PATH=$PLATFORM_PREFIX/bin:$PATH

export CPPFLAGS="-I$PLATFORM_PREFIX/include $CFLAGS -I$ANDROID_NDK/sources/android/cpufeatures $5"
export LDFLAGS="-L$PLATFORM_PREFIX/lib"
export PKG_CONFIG_PATH=$PLATFORM_PREFIX/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_PATH
export TARGET_HOST="$4"
export CC="$TARGET_HOST-clang"
export CXX="$TARGET_HOST-clang++"
if [ "$ENABLE_CCACHE" ]; then
   export CC="ccache $TARGET_HOST-clang"
   export CXX="ccache $TARGET_HOST-clang++"
fi

mkdir ${BUILD_DIR}
cd ${BUILD_DIR}

sh $ICU_SOURCE/configure --host=$TARGET_HOST -with-cross-build=${PREBUILD} ${CONFIG_PREFIX} --prefix=$PLATFORM_PREFIX

make clean
make -j4
make install

cd ..

mkdir lib/$2

cp ${BUILD_DIR}/lib/* ./lib/$2/

rm -rf ${PLATFORM_PREFIX}
rm -rf ${BUILD_DIR}

}


echo "==============================="
echo "==== Run build for Android ===="
echo "==============================="

mkdir lib

####################################################
# Install standalone toolchain x86

build "x86" "x86" "x86" "i686-linux-android" ""

####################################################
# Install standalone toolchain x86_64

build "x86_64" "x86_64" "x86_64" "x86_64-linux-android" ""


################################################################
# Install standalone toolchain ARMeabi

build "ARMeabi" "armeabi" "arm" "arm-linux-androideabi" ""

################################################################
# Install standalone toolchain ARMeabi-v7a

build "ARMeabi-v7a" "armeabi-v7a" "arm" "arm-linux-androideabi" "-march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3"

################################################################
# Install standalone toolchain ARM64-v8a

build "ARM64-v8a" "arm64-v8a" "arm64" "aarch64-linux-android" ""


mkdir include
mkdir include/unicode
cp ${ICU_SOURCE}/common/unicode/*.h ./include/unicode

1 Ответ

0 голосов
/ 01 апреля 2019

Я столкнулся с этой проблемой (для i686, но не для armeabi-v7a) с:

JNINativeMethod natives[]={*whatever*};

Я превратил это в:

static JNINativeMethod natives[]={*whatever*};

Теперь работает нормально. (Я не уверен, поможет ли это вам.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...