しばらく、Android開発を怠っていたので、すっかり変わってしまったAndroid NDK 開発環境について行けてませんでした。

NDKが、AndroidStudio cmake環境を推奨するようになったので、cmakeでビルド出来る物は、なんとかなりますが、そうでないのは、面倒ですよ。

opensslなんか、独自のConfigureスクリプトなんで、環境変数設定しまくりですよね。

ということで、 openssl-1.1.1n をビルドしてみました。

開発環境は、ubuntu 22 です。 


openssl-1.1.1n.tar.gz をダウンロードしてきて、適当なフォルダに展開します。

/---openssl-1.1.1n

 |--output  <- ここにインクルードとライブラリが出来上がります。

 |--build.sh


Configure なんですが、Androidでちょっと問題が発生しました。

Configurations/15-android.conf というファイルが、Android環境を構築するスクリプトなんですが、clangコンパイラを発見出来ないようで、どうしてもgccを使おうとしてしまいます。

修正するのも面倒なので、以下をコメントアウトして、自前でコンパイラ等を指定する方法を採用します。

 

105-146行 コメントアウト
# see if there is NDK clang on $PATH, "universal" or "standalone"
               〜
# $user{CROSS_COMPILE} = "$triarch-";
# }

 

まともなやり方がわかる人、教えてほしいです。

 


scratch.sh

#!/bin/bash

rm -rf output/*

cd openssl-1.1.1n
make clean

#TOOLCHAIN
export ANDROID_SDK=~/Android/Sdk
export NDKVER=24.0.8215888
export NDK=${ANDROID_SDK}/ndk/${NDKVER}
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export ANDROID_NDK_HOME=${NDK}

#API
export API=30

#OPENSSL
export OUTPUT_DIR=`pwd`/../output

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++
./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
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-armeabi 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

#TOOLCHAIN
export ANDROID_SDK=~/Android/Sdk
export NDKVER=24.0.8215888
export NDK=${ANDROID_SDK}/ndk/${NDKVER}
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export CMAKE=${ANDROID_SDK}/cmake/3.18.1/bin/cmake
export LIBSSH=libssh-0.9.6
export OUTPUT_DIR=`pwd`/output
export OPENSSL_DIR=../openssl/output

export MAKE=${NDK}/prebuilt/linux-x86_64/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="-Werror,-Wimplicit-function-declaration" \
-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

Joomla templates by a4joomla