使用CMake进行android native开发
转载时请注明出处和作者联系方式: https://mogoweb.net(betway官网首页) betway官网首页@gmail.com
Android NDK中提供了ndk-build脚本,以及若干mk文件,以简化ndk的开发,这对于开发一些小型应用来说足够了,但是对于一些大型项目,特别是涉及到很多第三方库时,管理起来就不是那么方便了(个人意见,Makefile写得好的人,可以无视)。在linux开源界,用得比较广泛的就是automake和cmake。本篇文章就是介绍如何使用cmake构建native程序的。
我之前写了一篇博客使用CMake构建android原生库,不过介绍的方法比较繁琐,最近在google code看到一个项目android-cmake,里面提供了脚本,这样使用起来就更方便了。下面就是介绍android-cmake的安装及使用方法。首先交代一下我的工作环境,ubuntu 10.10 32bit、Android NDK r6及Android SDK r12。接下来的步骤是:
1)下载android-cmake
hg clone https://mogoweb.net/comment-page-1-2/ $HOME/android/android-cmake
2)使用NDK创建单独的工具链
export NDK=~/android/android-ndk-r6
$NDK/build/tools/make-standalone-toolchain.sh -platform=android-5 -install-dir=$HOME/android/android-toolchain
3)将如下代码加入$HOME/.profile
export ANDROID_NDK_TOOLCHAIN_ROOT=$HOME/android/android-toolchain
export ANDTOOLCHAIN=$HOME/android/android-cmake/toolchain/android.toolchain.cmake
alias android-cmake=’cmake –DCMAKE_TOOLCHAIN_FILE=$ANDTOOLCHAIN ’
android-cmake包含了若干示例,从helloworld到复杂的boost库,先从一个简单的hello-cmake开始吧。
cd samples/hello-cmake
mkdir androidbuild
cd androidbuild
android-cmake ..
make
即可编译出libhello-cmake.so,位于libs/armeabi-v7a。可以使用cmake GUI来修改某些设置:
cmake-gui ..
注:这个例子只包含了java和jni的代码,并没有包括android工程,android工程在hello-android-cmake目录下。
在编译过程中,可能会出现如下错误:
- SWIG is not found
- The C compiler identification is GNU
- The CXX compiler identification is GNU
- Check for working C compiler: /home/alex/android/android-toolchain/bin/arm-linux-androideabi-gcc
- Check for working C compiler: /home/alex/android/android-toolchain/bin/arm-linux-androideabi-gcc — works
- Detecting C compiler ABI info
CMake Error: Could not COPY_FILE.
OutputFile: ”
copyFile: ‘/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeDetermineCompilerABI_C.bin’
Unable to find executable for try_compile: tried "/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeTmp/cmTryCompileExec" and "/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeTmp/Debug/cmTryCompileExec" and "/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeTmp/Development/cmTryCompileExec".
- Detecting C compiler ABI info - done
CMake Error at /usr/share/cmake-2.8/Modules/CMakeDetermineCompilerABI.cmake:40 (FILE):
file STRINGS file
"/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeDetermineCompilerABI_C.bin"
cannot be read.
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:71 (CMAKE_DETERMINE_COMPILER_ABI)
CMakeLists.txt:3 (project)
- Check for working CXX compiler: /home/alex/android/android-toolchain/bin/arm-linux-androideabi-g++
- Check for working CXX compiler: /home/alex/android/android-toolchain/bin/arm-linux-androideabi-g++ — works
- Detecting CXX compiler ABI info
CMake Error: Could not COPY_FILE.
OutputFile: ”
copyFile: ‘/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin’
Unable to find executable for try_compile: tried "/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeTmp/cmTryCompileExec" and "/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeTmp/Debug/cmTryCompileExec" and "/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeTmp/Development/cmTryCompileExec".
- Detecting CXX compiler ABI info - done
CMake Error at /usr/share/cmake-2.8/Modules/CMakeDetermineCompilerABI.cmake:40 (FILE):
file STRINGS file
"/home/alex/android/android-cmake/samples/hello-cmake/androidbuild/CMakeFiles/CMakeDetermineCompilerABI_CXX.bin"
cannot be read.
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/CMakeTestCXXCompiler.cmake:64 (CMAKE_DETERMINE_COMPILER_ABI)
CMakeLists.txt:3 (project)
- Configuring incomplete, errors occurred!
原因在于在测试编译器时,链接后的程序默认放在bin/armeabi-v7a目录下,而测试代码在另外的目录下去查找生成文件,解决的方法是修改$ANDTOOLCHAIN文件,将
set( EXECUTABLE_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ARMEABI_NDK_NAME} CACHE PATH "Output directory for applications" FORCE)
改成
set( EXECUTABLE_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH_ROOT} CACHE PATH "Output directory for applications" FORCE)
补充:
在使用cmake构建webkit android porting时,出现错误:
Could NOT find BISON (missing: BISON_EXECUTABLE)
原因在于$ANDTOOLCHAIN文件中修改了CMake系统变量:
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
解决的方法是将代码中这样的语句注释掉。
转载时请注明出处和作者联系方式: 使用CMake进行android native开发(betway官网首页) betway官网首页@gmail.com
你好,我看了你的这篇博客,以及android-cmake官网的一些文档,发现所谈之技术都没有支持x86的,不知道你对于如何将android-cmake支持x86呢? Thanks. Please feel free to contact me.
没有使用过x86版本的。不过最新的ndk已经支持x86了,只要修改一下android.toolchain.cmake文件,指向x86版本的工具链就可以了