直接使用其它版本的交叉编译器,静态编译;
利用 android 源码来进行编译;
参考博客:编译Android平台运行的C程序
使用 ndk、和 cmake 来编译;
- liangtao:cmake_android$cmake -version
- cmake version 3.10.2
-
- CMake suite maintained and supported by Kitware (kitware.com/cmake).
- liangtao:cmake_android$uname -a
- Linux ubuntu 5.4.0-131-generic #147~18.04.1-Ubuntu SMP Sat Oct 15 13:10:18 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
- liangtao:cmake_android$
在官网下载最新的 NDK 就行,我使用的是 android-ndk-r25b-linux.zip ;
将下载好的文件,解压到一个目录;
- # 我的目录是
- /opt/work/android-ndk-r25b
创建一个目录,用来放源码、CMakeLists.txt、外部构建脚本文件;
- # 我的目录是
- /opt/work/cmake_android
-
- # 在该目录下创建 3 个文件
- liangtao:cmake_android$ls -al
- total 20
- drwxrwxr-x 2 liangtao liangtao 4096 Nov 9 09:19 .
- drwxrwxr-x 11 liangtao liangtao 4096 Nov 9 09:07 ..
- -rw-rw-r-- 1 liangtao liangtao 200 Nov 9 09:13 CMakeLists.txt
- -rw-r--r-- 1 liangtao liangtao 107 Nov 9 09:08 main.c
- -rw-rw-r-- 1 liangtao liangtao 330 Nov 9 09:12 runhello.sh
CMakeLists.txt 文件
- cmake_minimum_required(VERSION 3.6)
- project(hello_ndk)
-
- add_definitions("-Wall -g")
-
- add_executable(${PROJECT_NAME} main.c)
-
- install(TARGETS ${PROJECT_NAME}
- RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})
runhello.sh 文件
因为我使用的平台是 android 6.0 的;所以 api 为 23;
ABI 版本 和 NDK 目录,按各自的修改;
- #!/bin/bash
-
- export NDK=/opt/work/android-ndk-r25b
- export ABI=armeabi-v7a
- export MINSDKVERSION=23
-
- rm -r build
- mkdir build && cd build
-
- cmake \
- -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
- -DANDROID_ABI=$ABI \
- -DANDROID_PLATFORM=android-$MINSDKVERSION \
- -DANDROID_NDK=$NDK \
- ..
-
- make
-
- cd ..
main.c 文件
- #include
-
- int main(int argc, char *argv[])
- {
- printf("Hello word.\n");
- return 0;
- }
- # 执行以下命令来编译
- . runhello.sh
至于 CMake 的学习,B 站随便找个视频就行;
另指定头文件和库文件方法如下:
include_directories() 括号里填写自定义头文件路径,需要添加在 add_executable 之前;
link_directories() 括号里填写自定义库文件路径,需要添加在 add_executable 之前;
target_link_libraries() 括号里填写项目名、库文件名,需要添加在 add_executable 之后;
例子:
- cmake_minimum_required(VERSION 3.6)
- project(hello_ndk)
-
- add_definitions("-Wall -g -DHELLO")
-
-
- include_directories(/opt/work/cmake_android)
- link_directories(/opt/work/cmake_android)
- add_executable(${PROJECT_NAME} main.c)
- target_link_libraries(${PROJECT_NAME} libhello.so)
-
- install(TARGETS ${PROJECT_NAME}
- RUNTIME DESTINATION ${PROJECT_SOURCE_DIR})
如果 CMake 版本不符合要求,可以去官网下载一个高版本的 CMake;
解压后在 runhello.sh 中使用绝对路径就行;
例:
- #!/bin/bash
-
- export NDK=/opt/liangtao/android-ndk-r25b
- export ABI=armeabi-v7a
- export MINSDKVERSION=23
-
- rm -r build
- mkdir build && cd build
-
- /opt/liangtao/cmake-3.6.0-Linux-x86_64/bin/cmake \
- -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
- -DANDROID_ABI=$ABI \
- -DANDROID_PLATFORM=android-$MINSDKVERSION \
- -DANDROID_NDK=$NDK \
- ..
-
- make
-
- cd ..