Linux中NDK编译静态库和动态库,在AndroidStudio上导入

下载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)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值