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