Windows環境下編譯Android平臺的libyuv
1. 說明
至於 libyuv
的用途,就不贅述了。以下是官方說明
Scale YUV to prepare content for compression, with point, bilinear or box filter.Convert to YUV from webcam formats for compression.Convert to RGB formats for rendering/effects.Rotate by 90/180/270 degrees to adjust for mobile devices in portrait mode.Optimized for SSSE3/AVX2 on x86/x64.Optimized for Neon on Arm.Optimized for MSA on Mips
2. 編譯過程
當然你也可以放在 Android+Studio/">Android Studio
上編譯。這裡是脫離 Android studio
開發環境編譯,直接編譯好動靜態庫和標頭檔案,可以copy給其它庫用。
2.1 下載
下載原始碼
: ofollow,noindex">https://chromium.googlesource.com/libyuv/libyuv/+archive/refs/heads/master.tar.gz
現在最新版本是 1917 ,可以在下載的原始碼中 include/libyuv/version.h
檢視版本號
2.2 稍改CMakeLists.txt指令碼
原本我們並不需要改變 CMakeLists.txt
指令碼,只是為了存放目錄,把動、靜態庫放在 lib
目錄,標頭檔案放在 include
目錄。如果不改變指令碼,編譯後,自己手動copy也是可以的。
最重要的就是, Android studio
整合 cmake
編譯,是在打包的時候才strip掉符號表。我們脫離 Android studio
開發環境,直接使用 Cmake
編譯,不管是 Release
版本還是 Debug
版本, Cmake
都沒有 Strip
掉符號表,庫會比較大,所以我們在腳本里定製一個command,直接 strip
掉符號表。一般我們不會debug開源庫
# CMakeLists for libyuv # Originally created for "roxlu build system" to compile libyuv on windows # Run with -DTEST=ON to build unit tests PROJECT ( YUV C CXX )# "C" is required even for C++ projects CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) OPTION( TEST "Built unit tests" OFF ) SET ( ly_base_dir${PROJECT_SOURCE_DIR} ) SET ( ly_src_dir${ly_base_dir}/source ) SET ( ly_inc_dir${ly_base_dir}/include ) SET ( ly_tst_dir${ly_base_dir}/unit_test ) SET ( ly_lib_nameyuv ) SET ( ly_lib_static ${ly_lib_name} ) SET ( ly_lib_shared ${ly_lib_name}_shared ) FILE ( GLOB_RECURSE ly_source_files ${ly_src_dir}/*.cc ) LIST ( SORTly_source_files ) FILE ( GLOB_RECURSE ly_unittest_sources ${ly_tst_dir}/*.cc ) LIST ( SORTly_unittest_sources ) INCLUDE_DIRECTORIES( BEFORE ${ly_inc_dir} ) # this creates the static library (.a) ADD_LIBRARY( ${ly_lib_static} STATIC ${ly_source_files} ) # this creates the shared library (.so) ADD_LIBRARY( ${ly_lib_shared} SHARED ${ly_source_files} ) SET_TARGET_PROPERTIES( ${ly_lib_shared} PROPERTIES OUTPUT_NAME "${ly_lib_name}" ) SET_TARGET_PROPERTIES( ${ly_lib_shared} PROPERTIES PREFIX "lib" ) # this creates the conversion tool ADD_EXECUTABLE( yuvconvert ${ly_base_dir}/util/yuvconvert.cc ) TARGET_LINK_LIBRARIES( yuvconvert ${ly_lib_static} ) INCLUDE ( FindJPEG ) if (JPEG_FOUND) include_directories( ${JPEG_INCLUDE_DIR} ) target_link_libraries( yuvconvert ${JPEG_LIBRARY} ) add_definitions( -DHAVE_JPEG ) endif() if(TEST) find_library(GTEST_LIBRARY gtest) if(GTEST_LIBRARY STREQUAL "GTEST_LIBRARY-NOTFOUND") set(GTEST_SRC_DIR /usr/src/gtest CACHE STRING "Location of gtest sources") if(EXISTS ${GTEST_SRC_DIR}/src/gtest-all.cc) message(STATUS "building gtest from sources in ${GTEST_SRC_DIR}") set(gtest_sources ${GTEST_SRC_DIR}/src/gtest-all.cc) add_library(gtest STATIC ${gtest_sources}) include_directories(${GTEST_SRC_DIR}) include_directories(${GTEST_SRC_DIR}/include) set(GTEST_LIBRARY gtest) else() message(FATAL_ERROR "TEST is set but unable to find gtest library") endif() endif() add_executable(libyuv_unittest ${ly_unittest_sources}) target_link_libraries(libyuv_unittest ${ly_lib_name} ${GTEST_LIBRARY}) find_library(PTHREAD_LIBRARY pthread) if(NOT PTHREAD_LIBRARY STREQUAL "PTHREAD_LIBRARY-NOTFOUND") target_link_libraries(libyuv_unittest pthread) endif() if (JPEG_FOUND) target_link_libraries(libyuv_unittest ${JPEG_LIBRARY}) endif() if(NACL AND NACL_LIBC STREQUAL "newlib") target_link_libraries(libyuv_unittest glibc-compat) endif() find_library(GFLAGS_LIBRARY gflags) if(NOT GFLAGS_LIBRARY STREQUAL "GFLAGS_LIBRARY-NOTFOUND") target_link_libraries(libyuv_unittest gflags) add_definitions(-DLIBYUV_USE_GFLAGS) endif() endif() # ----------------------------------新加的內容------------------------------------- # 為了是目錄更明確,自己建立目錄 if(NOT EXISTS CMAKE_INSTALL_PREFIX) message(WARNING "目錄${CMAKE_INSTALL_PREFIX}-----not exists---------------") file(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/bin ${CMAKE_INSTALL_PREFIX}/lib ${CMAKE_INSTALL_PREFIX}/include) endif() #copy標頭檔案資料夾,動態庫和靜態庫檔案都放在lib目錄,標頭檔案放在include目錄 add_custom_command( TARGET ${ly_lib_shared} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${ly_inc_dir} ${CMAKE_INSTALL_PREFIX}/include) # strip動態庫的符號表 add_custom_command( TARGET ${ly_lib_shared} POST_BUILD COMMAND "${ANDROID_TOOLCHAIN_PREFIX}strip" "--strip-unneeded" "-o" "${CMAKE_INSTALL_PREFIX}/lib/lib${ly_lib_name}-strip.so" "${CMAKE_INSTALL_PREFIX}/lib/lib${ly_lib_name}.so" COMMENT "strip符號表") # --------------------------------------------------------------------------------- # install the conversion tool, .so, .a, and all the header files INSTALL ( PROGRAMS ${CMAKE_BINARY_DIR}/yuvconvertDESTINATION ${CMAKE_INSTALL_PREFIX}/bin ) INSTALL ( TARGETS ${ly_lib_static}DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) INSTALL ( TARGETS ${ly_lib_shared} LIBRARYDESTINATION lib RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin ) INSTALL ( DIRECTORY ${PROJECT_SOURCE_DIR}/include/DESTINATION ${CMAKE_INSTALL_PREFIX}/include ) # create the .deb and .rpm packages using cpack INCLUDE ( CM_linux_packages.cmake )
2.3 Windows環境編譯指令碼bat
@echo off cls ::========================================================================== ::本指令碼用來用來在Windows環境使用Cmake交叉編譯Android使用的libyuv庫 ::========================================================================== title cmake build libyuv chcp 65001>nul echo. echo. echo.--------本指令碼用來用來在Windows環境使用Cmake交叉編譯Android使用的庫------ echo. echo CMD Path:%cd% echo 當前 dir:%~dp0 rem 切換到當前目錄 cd /d %~dp0 :: -------------------------------------------------------------------------- rem 臨時變數 set ANDROID_NDK=F:/Android/android-ndk-r16b set CMAKE_PATH=D:/Android/android-sdk/cmake/3.6.4111459 set NASM_PATH=D:/Progra~1/Android/nasm-2.13.03 set ANDROID_VERSION=24 set SOURCE_DIR=./libyuv-refs_heads_master set NATIVE_BUILD_DIR=. set INSTALL_DIR=%~dp0 :: -------------------------------------------------------------------------- echo. echo.--------------------------開始build-------------------------------------- echo. rem --make armeabi call:buildLibTurboJpeg armeabi rem --make armeabi-v7a call:buildLibTurboJpeg armeabi-v7a rem --make arm64-v8a call:buildLibTurboJpeg arm64-v8a rem --make x86 call:buildLibTurboJpeg x86 rem --make x86_64 call:buildLibTurboJpeg x86_64 set timeout=5 echo.倒計時 %timeout% 秒鐘後自動退出 for /L %%a in (%timeout% -1 1) do ( ^ set /p=%%a . <nul&ping -n 2 127.0.0.1>nul ) echo. echo.&pause&goto:eof :: -------------------------------------------------------------------------- rem 定義函式 (%1:arch,%2:abi) :buildLibTurboJpeg setlocal echo.[func]-----------------start make [%1]--------------------------- echo. set ABI=%1 set BINARY_DIR="%NATIVE_BUILD_DIR%/bin/%ABI%" set PLATFORM_VERSION=%ANDROID_VERSION% set LIB_OUTPUT_DIR="%INSTALL_DIR%/dist/%ABI%" echo [func]----PLATFORM_VERSION==%ANDROID_VERSION% echo [func]----ABI==%ABI% echo [func]----SOURCE_DIR==%SOURCE_DIR% echo [func]----BINARY_DIR==%BINARY_DIR% echo [func]----LIB_OUTPUT_DIR==%LIB_OUTPUT_DIR% echo. echo. if not exist %BINARY_DIR% md %BINARY_DIR% cd /d %BINARY_DIR% ::-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=../../%LIB_OUTPUT_DIR% ^ ::-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=../../%LIB_OUTPUT_DIR% ^ ::-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=%LIB_OUTPUT_DIR% ^ ::-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=%LIB_OUTPUT_DIR% ^ rem 開源庫有提供cmakeAndroid Gradle - Ninja ^ cmake ^ -DANDROID_ABI=%ABI% ^ -DANDROID_PLATFORM=android-%PLATFORM_VERSION% ^ -DCMAKE_INSTALL_PREFIX=%LIB_OUTPUT_DIR% ^ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=%LIB_OUTPUT_DIR%/lib ^ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=%LIB_OUTPUT_DIR%/lib ^ -DCMAKE_BUILD_TYPE=Release ^ -DANDROID_NDK=%ANDROID_NDK% ^ -DCMAKE_TOOLCHAIN_FILE=%ANDROID_NDK%/build/cmake/android.toolchain.cmake ^ -DCMAKE_MAKE_PROGRAM=%CMAKE_PATH%/bin/ninja.exe ^ -G"Android Gradle - Ninja" ^ -DANDROID_ARM_NEON=TRUE ^ -DANDROID_TOOLCHAIN=clang ^ -DANDROID_STL=c++_static ^ -DCMAKE_C_FLAGS=" -Os -Wall -pipe -fPIC" ^ -DANDROID_CPP_FEATURES=rtti exceptions ^ ../../%SOURCE_DIR% cmake --build ./ rem ninja -C . cd ../../ echo.[func]-----------------[%1] make end--------------------------- echo. endlocal goto:eof
2.4 編譯靜態、動態庫
雙擊執行以上指令碼儲存的bat檔案即可,等待編譯完成

編譯安裝目錄

ABIS

arm64-v8a

libs