下载ndk
地址:https://github.com/android/ndk/wiki/Unsupported-Downloads#r17c
这里使用 r17c 的
ndk下载地址:https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip
在服务器上运行下载ndk:
wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip
解压:
unzip android-ndk-r17c-linux-x86_64.zip
配置环境变量
vim .bashrc
source .bashrc
# NDK目录
export NDK="/root/my-ndk/android-ndk-r17c"
# NDK 的 x86的gcc
export NDK_GCC_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc"
# NDK 的 x64的gcc
export NDK_GCC_x64="$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc"
# NDK 的 arm32的gcc
export NDK_GCC_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc"
# NDK 的 arm64的gcc
export NDK_GCC_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc"
# --sysroot 寻找库文件头文件 -isystem 寻找头文件 -isystem C运行期寻找asm
# x86
export NDK_CONFIG_86="--sysroot=$NDK/platforms/android-28/arch-x86 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/i686-linux-android"
# x64
export NDK_CONFIG_64="--sysroot=$NDK/platforms/android-28/arch-x86_64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/x86_64-linux-android"
# arm32
export NDK_CONFIG_arm="--sysroot=$NDK/platforms/android-28/arch-arm -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/arm-linux-androideabi"
# arm64
export NDK_CONFIG_arm_64="--sysroot=$NDK/platforms/android-28/arch-arm64 -isystem $NDK/sysroot/usr/include -isystem $NDK/sysroot/usr/include/aarch64-linux-android"
# 用于静态库编译
# x86
export NDK_AR_x86="$NDK/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-ar"
# x64
export NDK_AR_x64="$NDK/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-ar"
# arm32
export NDK_AR_arm="$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar"
# arm64
export NDK_AR_arm_64="$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar"
查看手机的cpu架构
adb shell
cat /proc/cpuinfo
C:\mysoftware\adb>adb shell
jason:/ $ cat /proc/cpuinfo
Processor : AArch64 Processor rev 4 (aarch64) ==== arm64位的,需要用 ndk 的 aarch64-linux-android-4.9
linux中编译出Android端可以用的动态库
[root@VM-32-17-centos ~]# vim get.h
[root@VM-32-17-centos ~]# vim get.c
[root@VM-32-17-centos ~]# cat get.h
#include<stdio.h>
int get();
[root@VM-32-17-centos ~]# cat get.c
#include "get.h"
int get() {
return 2333;
}
[root@VM-32-17-centos ~]# $NDK_GCC_arm_64 $NDK_CONFIG_arm_64 -fPIC -shared get.c -o libgetndk.so
[root@VM-32-17-centos ~]# ls -l libgetndk.so
-rwxr-xr-x 1 root root 7104 Oct 14 21:13 libgetndk.so
[root@VM-32-17-centos ~]# file libgetndk.so
libgetndk.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped
linux中编译出Android端可以用的静态库
必须使用NDK交叉编译,打出xxx.o
然后编译出静态库
[root@VM-32-17-centos ~]# $NDK_GCC_arm_64 $NDK_CONFIG_arm_64 -fPIC -c get.c -o getndk.o
[root@VM-32-17-centos ~]# ll
-rw-r--r-- 1 root root 992 Oct 14 21:30 getndk.o
[root@VM-32-17-centos ~]# $NDK_AR_arm_64 rcs -o libgetndk.a getndk.o
/root/my-ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar: /usr/lib64/libc.so.6: version `GLIBC_2.18' not found (required by /root/my-ndk/android-ndk-r17c/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/../bin/../lib/bfd-plugins/../lib64/libc++.so.1)
[root@VM-32-17-centos ~]# echo $?
0
[root@VM-32-17-centos ~]# ll
-rw-r--r-- 1 root root 992 Oct 14 21:30 getndk.o
-rw-r--r-- 1 root root 1132 Oct 14 21:30 libgetndk.a
在AS中进行导入动态库
配置CPU平台
Cmake导入动态库
# 导入源文件
file(GLOB allCPP *.c *.h *.cpp)
add_library(
native-lib
SHARED
${allCPP})
# 导入库文件
# CMAKE_SOURCE_DIR 等于 CMakeLists.txt所在的地址目录
# CMAKE_ANDROID_ARCH_ABI 等于 当前手机的CPU架构
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
native-lib.cpp
在AS中进行导入静态库
大部分同动态库导入
Cmake导入静态库
## 导入静态库
# CMAKE_SOURCE_DIR 等于 CMakeLists.txt所在的地址目录
add_library(getndk STATIC IMPORTED)
set_target_properties(getndk PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libgetndk.a)