CMAKE 在Linux下 構建android 編譯、打包、發佈環境

環境:
html

    linux :2.6.32-279.el6.x86_64
    linux 版本 cmake: http://www.cmake.org/cmake/resources/software.html
    android:
            linux版本 sdk:http://developer.android.com/sdk/index.html 
            linux 版本 ndk:http://developer.android.com/tools/sdk/ndk/index.html
    項目代碼:project 目錄,是C++ 、C語言代碼
    以上版本注意linux系統是32仍是64位版本的不一樣。
 個人思路是:用cmake編譯project代碼爲一個.so庫,而後java代碼調用.so庫,最終打包爲apk
方法:
       一、 將上面的sdk 、ndk以及project解壓放在本身的工做目錄。例如我是這樣的:
            [workspace]$ ls
            adt  project
            [workspace]$ ls adt
            eclipse  ndk  sdk

    二、目錄構建好以後,進入project工程的jni目錄裏面java

        cd   /home/test/workspace/project/MobileClient/android/jni


         這裏面有andorid 編譯用的各個目錄。
linux

        [ jni]$ ls
        AmkList.txt     build           game.h    gametest.h  jni.cpp      target
        Android.mk      CMakeLists.txt  Game          glTest.cpp  jvm  testCamera.cpp
        Application.mk  game.cpp    gametest.cpp  glTest.h    libcode.mk  source.mk       testCamera.h

        jni目錄上層目錄裏面的內容: android

        [android]$ls
       AndroidManifest.xml  gen   res  asserts    libs     bin  obj      src     jni
       這些都是android編譯環境的標準目錄結構,咱們的cmake就在jni目錄裏面構建的。
    三、利用ndk編譯android的交叉工具鏈,命令make-standalone-toolchain.sh
        進入ndk的tools目錄,裏面都是一些腳本程序


        /home/test/workspace/adt/ndk/build/tools


        執行命令c++

         [tools]$  ./make-standalone-toolchain.sh --platform=android-12 --ndk-dir=/home/test/workspace/adt/ndk/ --install-dir=/opt/android-12-toolchain/ --system=linux-x86_64


 

       --platform 平臺
        --ndk-dir ndk的路徑
        --install-dir是安裝路徑
        --system是操做系統,若是不寫的話,腳本會自動提示你的。
    這樣命令就安裝到了/opt/目錄下面了,咱們的cmake還用到裏面的lib 和頭文件。
     安裝完以後設置環境變量,不設置的話cmake就不會到裏面尋找咱們須要的庫,而是去系統都文件裏面找。
    命令: export PATH=$PATH:/opt/android-12-toolchain/sysroot/usr/lib/
     四、在jni目錄編寫CMakeLists.txt文件,個人cmake是要編譯出來爲so庫,CMakeLists.txt的內容爲:
            PROJECT(GAME)  工程名字

            SET(CMAKE_SYSTEM_NAME  Android) 
            SET(CMAKE_CXX_COMPILER "/opt/android-12-toolchain/arm-linux-androideabi/bin/g++")  交叉編譯工具
            SET(CMAKE_C_COMPILER "/opt/android-12-toolchain/arm-linux-androideabi/bin/gcc")
shell


            顯示系統信息bash

            MESSAGE(STATUS "System Info:" ${CMAKE_SYSTEM}) 
            MESSAGE(STATUS "System Processor:" ${CMAKE_SYSTEM_PROCESSOR})
            MESSAGE(STATUS "BUILD TYPE : " ${CMAKE_BUILD_TYPE})


        設置代碼裏面的宏定義    eclipse

        ADD_DEFINITIONS(-DANDROID -DLINUX -DUNIX jvm

             -D_DISABLE_CXX_EXCEPTION ide

             -DFT2_BUILD_LIBRARY -D__GL_ES_2_ 

             -DAL_BUILD_LIBRARY -DAL_ALEXT_PROTOTYPES

             -D_ARM_ASSEM_ -DNDK_DEBUG

             -DKTX_OPENGL_ES2=1)

        要求cmake的最低版本

            CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

            設置編譯以後的目標生成路徑

            SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../target)

         包含編譯須要的頭文件,

            INCLUDE_DIRECTORIES(".")

            INCLUDE_DIRECTORIES("./jvm")

            INCLUDE_DIRECTORIES("../../../Src/Core/inc")

            INCLUDE_DIRECTORIES("../../../Src/OGES2/inc")

            INCLUDE_DIRECTORIES("../../../External/freetype/FreeType2/include")

            INCLUDE_DIRECTORIES("../../../External/OGLES2")

            INCLUDE_DIRECTORIES("../../../External/OGLES2/Include")

            INCLUDE_DIRECTORIES("../../../External/OGLES2/Include/GLES2")

            INCLUDE_DIRECTORIES("../../OpenAL4Android/include")

            INCLUDE_DIRECTORIES("../../OpenAL4Android/OpenAL32/Include")

            INCLUDE_DIRECTORIES("../../../External/luatinker/inc")

            INCLUDE_DIRECTORIES("../../../MobileProtocol")

            INCLUDE_DIRECTORIES("../../../MobileServer/Core/Networkware/msg")

            INCLUDE_DIRECTORIES("./jvm")

            #INCLUDE_DIRECTORIES("/usr/include/")

            #INCLUDE_DIRECTORIES("/usr/include/sys")

            FIND_LIBRARY(LIB_CSTD_DIR NAMES stdc++)

            找的編譯須要的庫文件,設置到變量裏面,下面鏈接的時候用

            IF(LIB_CSTD_DIR)

             MESSAGE(STATUS "LIB_CSTD_DIR: "${LIB_CSTD_DIR})

            ENDIF(LIB_CSTD_DIR)

            FIND_LIBRARY(LIB_C_DIR NAMES c)

            IF(LIB_C_DIR)

             MESSAGE(STATUS "LIB_C_DIR: "${LIB_C_DIR})

            ENDIF(LIB_C_DIR)

            FIND_LIBRARY(LIB_M_DIR NAMES m)

            IF(LIB_M_DIR)

             MESSAGE(STATUS "LIB_M_DIR: "${LIB_M_DIR})

            ENDIF(LIB_M_DIR)

            FIND_LIBRARY(LIB_DL_DIR NAMES dl)

            IF(LIB_DL_DIR)

             MESSAGE(STATUS "LIB_DL_DIR: "${LIB_DL_DIR})

            ENDIF(LIB_DL_DIR)

            FIND_LIBRARY(LIB_LOG_DIR NAMES log)

            IF(LIB_LOG_DIR)

             MESSAGE(STATUS "LIB_LOG_DIR: "${LIB_LOG_DIR})

            ENDIF(LIB_LOG_DIR)

            FIND_LIBRARY(LIB_GLESV2_DIR NAMES GLESv2)

            IF(LIB_GLESV2_DIR)

             MESSAGE(STATUS "LIB_GLESV2_DIR: "${LIB_GLESV2_DIR})

            ENDIF(LIB_GLESV2_DIR)

            FIND_FILE(CRTBEGIN_DIR NAMES crtbegin_dynamic.o)

            IF(CRTBEGIN_DIR)

             MESSAGE(STATUS "CRTBEGIN_DIR:" ${CRTBEGIN_DIR})

            ENDIF(CRTBEGIN_DIR)

            FIND_FILE(CRTEND_ANDROID_DIR NAMES crtend_android.o)


            IF(CRTEND_ANDROID_DIR)

             MESSAGE(STATUS "CRTEND_ANDROID_DIR:" ${CRTEND_ANDROID_DIR})

            ENDIF(CRTEND_ANDROID_DIR)

            編譯須要的c、c++文件

            也能夠直接包含目錄「AUX_SOURCE_DIRECTORY("../../../Src/Core/src/" CORE_SRCS)」

            SET(PUGIXML_SRCS "../../../External/pugixml/src/pugixml.cpp")

            SET(LPNG167_SRCS "../../../External/lpng167/png.c"

             "../../../External/lpng167/pngerror.c"   

             "../../../External/lpng167/pngwutil.c"

             )


            SET(KTX20_SRCS "../../../External/ktx20/include/errstr.c"

               "../../../External/ktx20/include/etcdec.cxx"

               "../../../External/ktx20/include/writer.c"

             )

            SET(OGES2_MOJOSHADER_SRCS "../../../Src/OGES2/mojoshader/mojoshader.cpp"

             "../../../Src/OGES2/mojoshader/mojoshader_assembler.cpp"

             "../../../Src/OGES2/mojoshader/mojoshader_preprocessor.cpp"

             )

            

            SET(OGES2_SRCS      "../../../Src/OGES2/src/zOGLESFrameBuffer.cpp"

             "../../../Src/OGES2/src/zOGLESMeshBufferResource.cpp"

             "../../../Src/OGES2/src/zOGLESTexture.cpp"

             "../../../Src/OGES2/src/zOGLShader.cpp"

             "../../../Src/OGES2/src/zRenderDeviceOGLES.cpp"

             )

            

            SET(GAMEFRAMEWORK_SRCS "../../gameFrameWork/clientConfigFile.cpp"

             "../../gameFrameWork/clientEventDevice.cpp"

             "../../gameFrameWork/game.cpp"

             "../../gameFrameWork/zHeightLayer.cpp"

             "../../gameFrameWork/zTrigger.cpp"

             )

            SET(GAMEFRAMEWORK_MSG_SRCS "../../gameFrameWork/Msg/clientNetFunction.cpp"

             "../../gameFrameWork/Msg/convert.cpp"

             "../../gameFrameWork/Msg/MsgLuaRegister.cpp"

             "../../gameFrameWork/Msg/systemMsgProcess.cpp"  

             )

            SET(GAMEFRAMEWORK_UI_SRCS "../../gameFrameWork/ui/maoXue.cpp"

             "../../gameFrameWork/ui/maoXueManager.cpp"

             "../../gameFrameWork/ui/ui_window.cpp"

             )

            SET(GAMEFRAMEWORK_CG_SRCS "../../gameFrameWork/cg/zAnimPath.cpp"

             "../../gameFrameWork/cg/zCgAnimation.cpp"

             "../../gameFrameWork/cg/zCgLogicSequence.cpp"

             )

            SET(NETWORK_SRCS "../../network/MD5.cpp"

             "../../network/networkAdapter.cpp"

             "../../network/networkconnector.cpp"

             "../../network/networkwarelzo.cpp"

             "../../network/networkwaremessage.cpp"

             )

            生成目標庫

            ADD_LIBRARY(game SHARED ${FREETYPE2_BASE_SRCS}

             jvm/JniHelper.cpp

             jvm/GameHelper.cpp

             jni.cpp

             cos_game.cpp

             glTest.cpp

             testCamera.cpp

             gametest.cpp

             Game/cosApplication.cpp

             Game/cos_main.cpp

             ${NETWORK_SRCS}

             ${PUGIXML_SRCS}

             ${ZLIB_SRCS}

             ${GAMEFRAMEWORK_UI_SRCS}

             ${GAMEFRAMEWORK_MSG_SRCS})

             #)

              須要鏈接的庫

             TARGET_LINK_LIBRARIES(cos_game ${LIB_CSTD_DIR}

               ${LIB_C_DIR} 

               ${LIB_M_DIR} 

               ${LIB_DL_DIR}

               ${LIB_GLESV2_DIR}

               ${LIB_LOG_DIR})

            依賴的crtbegin_dynamic.o 和 crtend_android.o  android編譯須要這兩個文件。

            add_dependencies(cos_game ${CRTBEGIN_DIR} ${CRTEND_ANDROID_DIR})

        五、編譯cmake,外部編譯

            在jni目錄下面創建build目錄 mkdir build,進入build目錄,執行下面的命令:

             cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
            生成libgame.so庫,而後copy到android目錄的libs目錄下面,必定要copy到libs目錄的armeabi目錄下面
         六、回到android目錄下面,生成apk文件,生成apk文件須要好幾步我寫了一個sh腳本,一塊兒執行,腳本以下:
#!/bin/bash
export PATH=$PATH:../../../adt/sdk/build-tools/19.0.3/
export PATH=$PATH:../../../adt/sdk/tools/
export PATH=$PATH:./jdk1.6.0_45/bin/  這個jdk須要下載,安裝,
aapt package -f -m -J gen -S res -I ../../../adt/sdk/platforms/android-19/android.jar -M AndroidManifest.xml
javac -target 1.5 -bootclasspath ../../../adt/sdk/platforms/android-19/android.jar -d bin src/com/cos/game/*.java gen/com/cos/game/R.java
dx --dex --output=bin/classes.dex bin
aapt  package -f -M AndroidManifest.xml -S res -A asserts -I ../../../adt/sdk/platforms/android-19/android.jar  -F bin/byreadreader  #若是apk要包含圖片、聲音,就放到asserts目錄下面  
apkbuilder byreadreader.apk -v -u -z bin/byreadreader -f bin/classes.dex -rf src -rj libs -nf libs #libs目錄就是咱們生成的庫
keytool -genkey -alias demo.keystore -keyalg RSA -validity 40000 -keystore demo.keystore
jarsigner -verbose -keystore demo.keystore -signedjar test.apk byreadreader.apk demo.keystore
主意:這些命令啥意思網上都有,能夠查看一下。上面腳本里面用到的目錄,都要和我寫的一摸同樣,不然可能出錯,單是沒有提示。
相關文章
相關標籤/搜索