CMake+Ndk编译Android可执行程序及动态库
编译方法
1、Android可执行程序可以通过ndk-build来编译;
2、在Android源码的中进行编译,可是Android源码的编译环境也不容易搭建;
3、visual studio2019集成Android开发环境来编译;
新增:使用Android Studio中CMake和NDK来编译可执行文件或动态库,下面以Windows环境为例。
可执行文件
测试 - test.cpp - 例子
#include<iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
对应CMakeLists.txt
cmake_minmum_required(VERSION 3.6)
project(Hello)
set(TARGET_NAME test)
add_executable(${TARGET_NAME}
test.cpp
)
为了方便使用cmake来编译,可使用如下编译脚本build.bat
set abi=armeabi-v7a
if not exist %abi% md %abi$
cd %abi%
%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/cmake ^
-DANDROID_ABI=%abi% ^
-DANDROID_NDK=%ANDROID_SDK_HOME%/ndk/22.0.7026061/build ^
-DCMAKE_BUILD_TYPE=Debug ^
-DCMAKE_TOOLCHAIN_FILE=%ANDROID_SDK_HOME%/ndk/22.0.7026061/build/cmake/android.toolchain.cmake ^
-DANDROID_NATIVE_API_LEVEL=9 ^
-DANDROID_TOOLCHAIN=clang -DCMAKE_GENERATOR="Ninja" ^
-DCMAKE_MAKE_PROGRAM=%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja ^
..
%ANDROID_SDK_HOME%/cmake/3.10.2.4988404/bin/ninja
cd ..
3.10.2.4988404为cmake的版本,22.0.7026061为ndk的版本。
注意:ANDROID_SDK_HOME环境变量的设置可能会导致Android Studio 模拟器无法正常运行。
报错如下:
Android studio Emulator: emulator: ERROR: Unknown AVD name [Pixel_2_API_24], use -list-avds to see valid list.
解决方法:
修改环境变量ANDROID_SDK_HOME路径指到platforms路径下
动态库
接口头文件 hello.h
\\ **** hello.h ****
#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif
接口代码hello.c
\\ **** hello.c ****
#include "hello.h"
void HelloFunc()
{
printf("Hello World\n");
}
生成动态库的CMakeLists.txt
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.6)
# 项目信息
project (hello)
SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
调用libhello库的测试代码helloworld.c
\\ **** helloworld.c ****
#include <stdio.h>
#include "hello.h"
int main()
{
HelloFunc();
return 0;
}
生成测试代码并连接hello库的CMakeLists.txt
# CMake最低版本号要求
cmake_minimum_required(VERSION 3.6)
# 项目信息
project (helloworld)
set(INC_DIR ./)
set(LIB_DIR armeabi-v7a/) # 动态库的存放路径,本例将动态库存放在当前路径armeabi-v7a目录下。
include_directories(${INC_DIR})
link_directories(${LIB_DIR})
link_libraries(hello)
add_executable(helloworld helloworld.c)
target_link_libraries(helloworld hello)
测试
使用Android Adb(调试桥)来进行测试,首先使用Android手机连接电脑或者开启模拟器,然后打开Terminal终端窗口输入。
adb root //或者root权限
adb shell //打开shell
// 成功获取root权限 generic:/ #
// 失败获取root权限 generic:/ $
将生成的文件通过adb推导设备上:
adb push test /data/local/tmp
修改文件权限
chmod 777 /data/local/tmp/test
运行文件
generic:/ # /data/local/tmp/test
注意点
当前测试已armeabi-v7a为例,具体版本以实际测试为准。