在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目录下生产成指定架构的库文件。