编程文汇

在windows上编译android native c++代码

android
cmake
unity
cxx
#1

1

相关文章很少,如果没有思路很难找到编译方法:主要是参考android官方文档,其次是观察AS是如何设置cmake的。可以用android studio创建一个c++工程,并编译,查看cmakecache,看AS是怎么设置cmake的,同样设置即可。

2

要找到sdk和ndk的目录,然后找到toolchain文件,最后找到sdk中的cmake。
传递给cmake命令即可。

其中:使用Ninja(用Ninja代替make),设置CMAKE_TOOLCHAIN_FILE,以及设置CMAKE_ANDROID_NDK,是能正确运行的前提。

3

建立如下cmake_do.bat

md build
cd build
set Sdk=C:/Users/zhmt/AppData/Local/Android/Sdk
set NDK=%Sdk%/ndk-bundle
set toolchain_file=%NDK%/build/cmake/android.toolchain.cmake
set cmake_root=%Sdk%/cmake/3.10.2.4988404
set path=%cmake_root%/bin;%path%

cmake ../..  -G Ninja^
 -DCMAKE_BUILD_TYPE=Release ^
 -DCMAKE_TOOLCHAIN_FILE=%toolchain_file% ^
 -DCMAKE_ANDROID_NDK=%NDK% ^
 -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a ^
 -DCMAKE_SYSTEM_VERSION=16 ^
 -DANDROID_PLATFORM=android-16 

 pause

这样做的好处就是,无论多少个平台,只使用一套cmake文件就行了,力求编译过程统一。

4

此时,我们的cmake脚本,会有多种编译目标,比如为windows编译、为linux编译,为android编译....
cmake脚本里会需要根据不同编译目标而选择不同的配置,这时就需要利用下面的方式来判断目标平台:

IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
	MESSAGE(STATUS "current platform: Linux ")
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
	MESSAGE(STATUS "current platform: Windows")
ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Android")
	MESSAGE(STATUS "current platform: Android")
ELSE ()
	MESSAGE(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")
ENDIF (CMAKE_SYSTEM_NAME MATCHES "Linux")

这里判断的是编译的目标操作系统,而不是当前编译程序所在系统。比如在windows上编译android .so文件,此时的CMAKE_SYSTEM_NAME就是Android,而不是windows。

0 Likes