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为例,具体版本以实际测试为准。

posted @ 2021-04-09 10:16  Jefflnb  阅读(2293)  评论(0编辑  收藏  举报