须知

Android Jni 开发是 Android 晋级和自身成长及深入都要学习的知识点。 在 Android 中使用编译工具新建 c++ 项目, 比猫画虎应该都可以或多或少去开发点 c++/c 代码, 并简单的使用 Jni 去调用。 编译好后, 在 build 中, 可以找到对应编译好的 so 文件。 那么抛开开发工具外, 它是怎么编译的呢, 这个搞懂后或者使用后会对其开发有更大的帮助和认识。

cmakelist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.15.2)

project(untitled2)

set(CMAKE_CXX_STANDARD 14)

message("--------------------------------------------- ${ANDROID_ABI} => ${PROJECT_BINARY_DIR}/libs/${ANDROID_ABI}")

include_directories(./)

set(SOURCES ./library.cpp)

# 编译某一个架构的
set(CMAKE_ANDROID_ARCH_ABI ${ANDROID_ABI})
set(CMAKE_ANDROID_NDK ${ANDROID_NDK})
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION ${ANDROID_API_LEVEL})
add_library(${PROJECT_NAME} SHARED ${SOURCES})
set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/libs/${ANDROID_ABI})

打包脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

rm -rf build

mkdir build
cd build

ANDROID_NDK="/Users/xiaoxige/Library/Android/sdk/ndk/25.1.8937393"
ANDROID_API_LEVEL=21

ARCHS=('armeabi-v7a' 'arm64-v8a' 'x86' 'x86_64')

function compile(){
# shellcheck disable=SC2068
for i in ${ARCHS[@]}; do
rm -rf CMakeFiles
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI="$i" \
-DANDROID_NDK=$ANDROID_NDK \
-DANDROID_API_LEVEL=$ANDROID_API_LEVEL \
..
make
done
}

compile