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為例,具體版本以實際測試為准。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM