1.前言
本文以libjpeg-turbo
为例,他是一个cmake项目,之前他是一个autoconf项目,需要使用其他方式来编译,将 NDK 与其他构建系统配合使用,如果网友有兴趣,以后有可能写。
前提准备,需要安装Windows = {cmake,nasm,MinGW},Android = {cmake(Android SDK中的),NDK,MSYS2},安装方法网上一大堆,这里不再赘述,默认大家都会[doge],注:大家下载的时候下载电脑对应的版本,e.g. 64位下载x86_64。
2.编译Windows自用
这个算是最简单的。
参考:
- 打开cmake-gui在安装位置的bin目录下
-
配置代码地址,以及中间件的生成位置,一般是在项目中新建build文件,这里可以直接追加build,cmake会自动创建。
导入项目 -
点击左下角的Configure,配置使用MinGW编译
image.png - 等待cmake运行完成后,可以看到读取CMakeLists.txt生成的配置项,这里勾选WITH_JPEG8,注意其中有一项是CMAKE_INSTALL_PREFIX,他是最终生成库的目录,记下,修改完成此时并没有完成,需要再次点击Configure,让红色消失,最后点击Configure旁边的的Generate来生成中间件。
配置 - 接下来我们进入build目录可以看到CMakeCache.txt,以及CMakeFiles等,在这里shift+右键打开控制台,输入mingw32-make使用MinGW编译。
- 这一步很重要,很多人在博文中都没有提及,编译完成后还需要安装,接着执行mingw32-make install,还记得上文提到的CMAKE_INSTALL_PREFIX么,我们在他对应的目录下找到编译好的库。其中include和lib是我们需要的。
安装位置
三方库
3.编译Android版本
比较复杂,经过自己多次尝试,在Windows环境下,只能使用Windows版本的cmake来编译,因为android.toolchain.cmake会根据cmake的属性来确定编译器,使用MSYS中的cmake,始终不能成功,或许可以但是本人还不会。如果nb的网友知道,可以告诉鄙人。
大家如果使用Android Studio可以看看.cxx/debug/{abi}/build_command这个文件会有启发。
参考(大致都一样[doge],但是有几个细节需要注意,下文会提到):
编译Android环境的libjpeg-turbo使用cmake
Android-JNI开发系列《十》实践利用libjpeg-turbo完美压缩图片不失真
介绍在MSYS2下执行,shell脚本,命令同Linux
# lib-name
MY_LIBS_NAME=libjpeg-turbo
# 当前位置
base=$(cd `dirname $0`; pwd)
# 代码位置
MY_SOURCE_DIR=${base}/libjpeg-turbo
# 编译结果位置
MY_BUILD_DIR=libjpeg-turbo_install
# export PATH=${CMAKE_PATH}/bin:$PATH
# ndk位置
ANDROID_NDK=/d/Compiler/ndk/21.4.7075529
# cmake位置
CMAKE_PATH=/d/Compiler/cmake/3.10.2.4988404
# 运行平台
BUILD_PLATFORM=windows-x86_64
TOOLCHAIN_VERSION=4.9
# 安卓最低版本
ANDROID_VERSION=21
# cpu flags
ANDROID_ARMV5_CFLAGS="-march=armv5te"
ANDROID_ARMV7_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon" # -mfpu=vfpv3-d16 -fexceptions -frtti
ANDROID_ARMV8_CFLAGS="-march=armv8-a " # -mfloat-abi=softfp -mfpu=neon -fexceptions -frtti
ANDROID_X86_CFLAGS="-march=i686 -mtune=intel -mssse3 -mfpmath=sse -m32"
ANDROID_X86_64_CFLAGS="-march=x86-64 -msse4.2 -mpopcnt -m64 -mtune=intel"
# params($1:arch,$2:arch_abi,$3:host,$4:compiler,$5:cflags,$6:processor)
build_bin() {
echo "-------------------start build $1-------------------------"
# cpu架构
ANDROID_ARCH_ABI=$1 # armeabi armeabi-v7a x86 mips
CFLAGS="$2"
# 生成库位置
LIB_OUTPUT_DIR=${base}/${MY_BUILD_DIR}/lib/${ANDROID_ARCH_ABI}
# build 中间件
BUILD_DIR=${base}/${MY_BUILD_DIR}/bin/${ANDROID_ARCH_ABI}
# echo "path==>$PATH"
echo "MY_SOURCE_DIR==>$MY_SOURCE_DIR"
echo "build_dir==>$BUILD_DIR"
echo "ANDROID_ARCH_ABI==>$ANDROID_ARCH_ABI"
echo "CFLAGS==>$CFLAGS"
mkdir -p ${BUILD_DIR}
# cd到build位置
cd ${BUILD_DIR}
# -DCMAKE_MAKE_PROGRAM=${ANDROID_NDK}/prebuilt/${BUILD_PLATFORM}/bin/make \
# -DCMAKE_ASM_COMPILER=${ANDROID_NDK}/prebuilt/${BUILD_PLATFORM}/bin/yasm \
# cmake -G"Unix Makefiles" \
# -DCMAKE_MAKE_PROGRAM=${CMAKE_PATH}/bin/ninja.exe \
# -G"Ninja" \
# -DCMAKE_C_COMPILER=${ANDROID_NDK}/toolchains/llvm/prebuilt/${BUILD_PLATFORM}/bin/armv7a-linux-androideabi21-clang \
# -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${LIB_OUTPUT_DIR}/lib \
# -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=${LIB_OUTPUT_DIR}/lib \
# DCMAKE_INSTALL_PREFIX生成的库安装目录
# DCMAKE_TOOLCHAIN_FILE工具链地址
# DCMAKE_MAKE_PROGRAM make工具
# DANDROID_ABI cpu架构
# DANDROID_PLATFORM 最低android版本
# DANDROID_TOOLCHAIN 工具链编辑编译器
# DWITH_JPEG8 编译jpeg8
${CMAKE_PATH}/bin/cmake \
-DCMAKE_INSTALL_PREFIX=${LIB_OUTPUT_DIR} \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POSITION_INDEPENDENT_CODE=1 \
-DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK}/build/cmake/android.toolchain.cmake \
-DCMAKE_MAKE_PROGRAM=${CMAKE_PATH}/bin/ninja.exe \
-G"Ninja" \
-DANDROID_ABI=${ANDROID_ARCH_ABI} \
-DANDROID_PLATFORM=android-${ANDROID_VERSION} \
-DCMAKE_C_FLAGS="${CFLAGS} -Os -Wall -pipe -fPIC" \
-DANDROID_NDK=${ANDROID_NDK} \
-DANDROID_ARM_NEON=TRUE \
-DANDROID_TOOLCHAIN=clang \
-DANDROID_STL=c++_shared \
-DANDROID_CPP_FEATURES=rtti exceptions \
-DWITH_JPEG8=1 \
${MY_SOURCE_DIR}
# 使用cmake 编译
${CMAKE_PATH}/bin/cmake --build ./
# 使用ninja安装
# ${CMAKE_PATH}/bin/ninja clean
# ${CMAKE_PATH}/bin/ninja
${CMAKE_PATH}/bin/ninja install
cd ../../../
echo "-------------------$1 build end-------------------------"
}
# 放开对应的架构以使用
# build armeabi
# build_bin armeabi "$ANDROID_ARMV5_CFLAGS"
#build armeabi-v7a
# build_bin armeabi-v7a "$ANDROID_ARMV7_CFLAGS"
#build arm64-v8a
# build_bin arm64-v8a "$ANDROID_ARMV8_CFLAGS"
#build x86
build_bin x86 "$ANDROID_X86_CFLAGS"
#build x86_64
# build_bin x86_64 "$ANDROID_X86_64_CFLAGS"
注意的点:
- 代码文件夹和shell脚本在同级目录
- 我们使用MSYS2外部的NDK来编译,所有执行命令的工具都指向外部
- ${CMAKE_PATH}/bin/cmake --build ./ 如果只执行到这里是得不到需要的三方库,还要使用ninja安装
# 使用ninja安装
${CMAKE_PATH}/bin/ninja install
- 上文的脚本只开启了x86的编译,如果需要可以自行修改
提一下直接使用.bat批处理也是可以的,可以参考
注意的点:这个脚本拿来改一改里面的目录就可以用了;需要注意里面没有install命令,需要各位聪明的网友在脚本末尾参考上文shell脚本添加ninja命令。
网友评论