しばらく、Android開発を怠っていたので、すっかり変わってしまったAndroid NDK 開発環境について行けてませんでした。
NDKが、AndroidStudio cmake環境を推奨するようになったので、cmakeでビルド出来る物は、なんとかなりますが、そうでないのは、面倒ですよ。
opensslなんか、独自のConfigureスクリプトなんで、環境変数設定しまくりですよね。
ということで、 openssl-3.1.4 をビルドしてみました。
開発環境は、ubuntu 22 です。 MacOSにも対応してみました。
openssl-3.1.4.tar.gz をダウンロードしてきて、適当なフォルダに展開します。
/---openssl-3.1.4
|--output <- ここにインクルードとライブラリが出来上がります。
|--build.sh
scratch.sh
#!/bin/bash
rm -rf output/*
cd openssl-3.1.4
#TOOLCHAIN
export NDKVER=26.1.10909125
PLATFORMNAME=`uname -s`
if [ $PLATFORMNAME = "Darwin" ]; then
export ANDROID_SDK=~/Library/Android/Sdk
LLVMPLATFORM="darwin-x86_64"
else
export ANDROID_SDK=~/Android/Sdk
LLVMPLATFORM="linux-x86_64"
fi
export NDK=${ANDROID_SDK}/ndk/${NDKVER}
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/${LLVMPLATFORM}
export ANDROID_NDK_ROOT=${NDK}
export MAKE=${NDK}/prebuilt/${LLVMPLATFORM}/bin/make
#API
export API=30
#OPENSSL
export OUTPUT_DIR=`pwd`/../output
${MAKE} clean
make_android() {
export TARGET=$1
export ARCH=$2
export NDKARCH=$3
export CFLAGS=$4
export LDFLAGS=$5
#Configure and build.
export AR=$TOOLCHAIN/bin/llvm-ar
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export AS=$CC
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export PATH=$TOOLCHAIN/bin:${PATH}
./Configure \
${ARCH} \
${CFLAGS} \
--prefix=${OUTPUT_DIR} \
--with-zlib-include=${TOOLCHAIN}/sysroot/usr/include \
--with-zlib-lib=${TOOLCHAIN}/sysroot/usr/lib \
zlib no-asm no-shared no-unit-test
${MAKE} build_generated libcrypto.a libssl.a
mkdir ${OUTPUT_DIR}/${NDKARCH}
mv libcrypto.a ${OUTPUT_DIR}/${NDKARCH}/.
mv libssl.a ${OUTPUT_DIR}/${NDKARCH}/.
cp -rf include/openssl ${OUTPUT_DIR}/${NDKARCH}/
${MAKE} clean
}
#ABI armv7a
make_android armv7a-linux-androideabi android-arm armeabi-v7a "" ""
#ABI aarch64
make_android aarch64-linux-android android-arm64 arm64-v8a "" ""
#ABI x86
make_android i686-linux-android android-x86 x86 "" ""
#ABI x86_64
make_android x86_64-linux-android android-x86_64 x86_64 "" ""
ついでに、libsshです。
libsshは、cmakeを使います。
libsshは、opensslに依存するので、opensslをビルドしてから、includeとlibの場所を指定する必要があります。
scratch.sh
#!/bin/bash
export LIBSSH=libssh-0.10.6
#TOOLCHAIN
export NDKVER=26.1.10909125
PLATFORMNAME=`uname -s`
if [ $PLATFORMNAME = "Darwin" ]; then
export ANDROID_SDK=~/Library/Android/Sdk
LLVMPLATFORM="darwin-x86_64"
else
export ANDROID_SDK=~/Android/Sdk
LLVMPLATFORM="linux-x86_64"
fi
export NDK=${ANDROID_SDK}/ndk/${NDKVER}
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/${LLVMPLATFORM}
export CMAKE=${ANDROID_SDK}/cmake/3.18.1/bin/cmake
export OUTPUT_DIR=`pwd`/output
export OPENSSL_DIR=../openssl/output
export MAKE=${NDK}/prebuilt/${LLVMPLATFORM}/bin/make
#API
export API_LEVEL=30
make_android() {
NDKARCH=$1
${CMAKE} \
-H${LIBSSH} \
-Bmakegenerate/${NDKARCH} \
-DOPENSSL_INCLUDE_DIR=${OPENSSL_DIR}/${NDKARCH} \
-DOPENSSL_SSL_LIBRARY=${OPENSSL_DIR}/${NDKARCH}/libssl.a \
-DOPENSSL_CRYPTO_LIBRARY=${OPENSSL_DIR}/${NDKARCH}/libcrypto.a \
-DWITH_EXAMPLES=OFF \
-DUNIT_TESTING=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DWITH_SERVER=OFF \
-DWITH_INTERNAL_DOC=OFF \
-DANDROID_ABI=${NDKARCH} \
-DANDROID_NATIVE_API_LEVEL=${API_LEVEL} \
-DANDROID_NDK=${NDK} \
-DCMAKE_TOOLCHAIN_FILE=${NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_VERBOSE_MAKEFILE=TRUE \
-DCMAKE_C_FLAGS="-std=gnu99 -Wno-int-conversion -D__USE_GNU" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_MAKE_PROGRAM=${MAKE}
cd makegenerate/${NDKARCH}
${MAKE}
mkdir ${OUTPUT_DIR}/${NDKARCH}
mkdir ${OUTPUT_DIR}/${NDKARCH}/libssh
mv src/libssh.a ${OUTPUT_DIR}/${NDKARCH}/.
cp config.h ${OUTPUT_DIR}/${NDKARCH}/.
cp include/libssh/libssh_version.h ${OUTPUT_DIR}/${NDKARCH}/libssh/.
cd ../..
}
#Rebuild
rm -rf makegenerate
rm -rf output/*
#ABI x86_64
make_android x86_64
#ABI armv7a
make_android armeabi-v7a
#ABI aarch64
make_android arm64-v8a
#ABI x86
make_android x86