Log4cplus 1.0.3 Android版本編譯
阿新 • • 發佈:2018-12-31
在Android上使用so庫時需要記錄日誌,當然可以直接通過C/C++檔案操作進行,也可以使用成熟的日誌庫來完成。
Log4cplus是C/C++跨平臺庫,效能、程式碼可讀性尚可,決定採用。
選用版本1.0.3 自帶VC2008 編譯工程檔案,但並未提供Android編譯方式。下面提供編譯Android版本的方法。
1. 安裝Cmake設定環境變數(使用cmake編譯),下載android-ndk-r10e-windows-x86_64,設定ANDROID_NDK環境變數。
1. 下載log4cplus-1.1.1版本(下載地址),log4cplus-1.0.3(下載地址)
下載1.1.1版本的目的是獲取該版本提供的Android編譯指令碼,方便編譯。
2. 解壓log4cplus-1.0.3目錄;解壓log4cplus-1.1.1目錄,檢視目錄結構後,可以看到android子目錄,將android整個目錄拷貝到1.0.3版本同級目錄下。
3. 修改android目錄下android.toolchain.cmake檔案(對於64位系統)
1 if( CMAKE_HOST_APPLE ) 2 set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86" ) 3 elseif( CMAKE_HOST_WIN32 ) 4 //64位系統需要設定windows-x86_64 5 //set( ANDROID_NDK_HOST_SYSTEM_NAME "windows" )6 set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" ) 7 set( TOOL_OS_SUFFIX ".exe" ) 8 elseif( CMAKE_HOST_UNIX ) 9 set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86" ) 10 else() 11 message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" ) 12 endif()
因為log4cplus使用了異常,如果Android使用stlport的話,需要啟用異常
if( NOT ANDROID_NDK_RELEASE STRLESS "r8d" ) set( ANDROID_EXCEPTIONS ON ) else() //啟用異常 //set( ANDROID_EXCEPTIONS OFF ) set( ANDROID_EXCEPTIONS ON ) endif() if( ANDROID_NDK_RELEASE STRLESS "r7" ) set( ANDROID_RTTI OFF ) else() set( ANDROID_RTTI ON ) endif()
4. 修改原始碼src/socket-unix.cxx
//去除if條件,ndk需要該標頭檔案,當然也可以預定義巨集 //#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__hpux__) || defined (__CYGWIN__) #include <netinet/in.h> //#endif
5. 如果需要編譯靜態庫,需要修改CMakeLists.txt檔案
#編譯靜態庫檔案.a
#add_library (log4cplus STATIC ${log4cplus_all_sources})
#編譯動態庫檔案.so
add_library (log4cplus SHARED ${log4cplus_all_sources})
6. 開啟命令列,進入log4cplus-1.0.3目錄下,執行命令:
cmake.exe -G"MinGW Makefiles" //指定stlport庫,與Application.mk保持一致,cmakelist檔案需要開啟異常 -DANDROID_STL=stlport_static -DANDROID_NATIVE_API_LEVEL=android-9 -DCMAKE_TOOLCHAIN_FILE="全路徑\log4cplus-1.0.3\android\android.toolchain.cmake" -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows-x86_64\bin\make.exe"
7. 執行命令:
cmake.exe --build .
編譯成功後,會在libs目錄下生產成指定架構的庫檔案。