NDK交叉编译及so库导入Android项目

}

配置NDK

Linux(使用GCC编译)

编辑Home/用户 目录下的.bashrc

vim /home/wangyz/.bashrc

添加以下内容

配置NDK的目录

export NDK_HOME=/home/wangyz/NDK/android-ndk-r17c

将NDK目录加入PATH中

export PATH= P A T H : PATH: PATH:NDK_HOME

x86 CPU架构的gcc

export NDK_GCC_x86=$NDK_HOME/toolchains/x86-4.9/prebuilt/linux-x86_64/bin/i686-linux-android-gcc

x86_64 CPU架构的gcc

export NDK_GCC_x64=$NDK_HOME/toolchains/x86_64-4.9/prebuilt/linux-x86_64/bin/x86_64-linux-android-gcc

ARM CPU架构的gcc

export NDK_GCC_ARM=$NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc

ARM64 CPU架构的gcc

export NDK_GCC_ARM_64=$NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc

x86 CPU架构 配置sysroot,isystem,否则会找不到头文件

export NDK_GCC_CONFIG_x86=“–sysroot=$NDK_HOME/platforms/android-21/arch-x86 -isystem $NDK_HOME/sysroot/usr/include -isystem $NDK_HOME/sysroot/usr/include/i686-linux-android”

x86_64 CPU架构 配置sysroot,isystem,否则会找不到头文件

export NDK_GCC_CONFIG_x64=“–sysroot=$NDK_HOME/platforms/android-21/arch-x86_64 -isystem $NDK_HOME/sysroot/usr/include -isystem $NDK_HOME/sysroot/usr/include/x86_64-linux-android”

ARM CPU架构 配置sysroot,isystem,否则会找不到头文件

export NDK_GCC_CONFIG_ARM=“–sysroot=$NDK_HOME/platforms/android-21/arch-arm -isystem $NDK_HOME/sysroot/usr/include -isystem $NDK_HOME/sysroot/usr/include/arm-linux-androideabi”

ARM64 CPU架构 配置sysroot,isystem,否则会找不到头文件

export NDK_GCC_CONFIG_ARM_64=“–sysroot=$NDK_HOME/platforms/android-21/arch-arm64 -isystem $NDK_HOME/sysroot/usr/include -isystem $NDK_HOME/sysroot/usr/include/aarch64-linux-android”

Mac(使用CLANG编译)

修改~/.bash_profile

vim ~/.bash_profile

添加以下内容

NDK目录

export NDK_HOME=/Users/ringle/Library/Android/sdk/ndk/21.1.6352462

CLANG目录

export CLANG=${NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/bin

添加到PATH中

export PATH= P A T H : {PATH}: PATH:{NDK_HOME}😒{CLANG}

编译

这里编译ARM64构架的so

GCC

$NDK_GCC_ARM_64 $NDK_GCC_CONFIG_ARM_64 -fPIC -shared get.c -o libndk-linux.so

CLANG

aarch64-linux-android21-clang -fPIC -shared hi.c -o libndk-mac.so

导入Android Studio
复制so到项目中

在app/src/main 目录下新建jniLibs目录,再新建arm64-v8a目录,将编译生成的libndk-linux.so及libndk-mac.so复制到目录下

配置cmake

在app/src/main 目录下新建cpp目录,新建CMakeLists.txt,配置如下:

For more information about using CMake with Android Studio, read the

documentation: https://d.android.com/studio/projects/add-native-code.html

Sets the minimum version of CMake required to build the native library.

cmake_minimum_required(VERSION 3.10.2)

Declares and names the project.

project(“ndk”)

包含所有CPP文件

file(GLOB allCPP *.cpp)

Creates and names a library, sets it as either STATIC

or SHARED, and provides the relative paths to its source code.

You can define multiple libraries, and CMake builds them for you.

Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.

native-lib

Sets the library as a shared library.

SHARED

Provides a relative path to your source file(s).

${allCPP})

Searches for a specified prebuilt library and stores the path as a

variable. Because CMake includes system libraries in the search path by

default, you only need to specify the name of the public NDK library

you want to add. CMake verifies that the library exists before

completing its build.

find_library( # Sets the name of the path variable.

log-lib

Specifies the name of the NDK library that

you want CMake to locate.

log)

set(CMAKE_CXX_FLAGS “ C M A K E C X X F L A G S − L {CMAKE_CXX_FLAGS} -L CMAKECXXFLAGSL{CMAKE_SOURCE_DIR}/…/jniLibs/${CMAKE_ANDROID_ARCH_ABI}”)

Specifies libraries CMake should link to your target library. You

can link multiple libraries, such as libraries you define in this

build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.

native-lib

Links the target library to the log library

included in the NDK.

${log-lib}

链接libndk-mac

ndk-mac

链接libndk-linux

ndk-linux

)

配置gradle

配置app模块下的build.gralde文件

android {

defaultConfig {

//…

externalNativeBuild {

cmake {

abiFilters “arm64-v8a”

}

}

ndk {

abiFilters “arm64-v8a”

}

}

externalNativeBuild {

cmake {

path “src/main/cpp/CMakeLists.txt”

version “3.10.2”

}

}

}

引用so中的方法

在cpp目录下,新建native-lib.cpp

#include <jni.h>

#include

#include <android/log.h>

#define TAG “Wangyz”

#define LOG_I(…) __android_log_print(ANDROID_LOG_INFO, TAG, VA_ARGS);

extern “C” int get();

extern “C” int hi();

extern “C” JNIEXPORT jstring JNICALL

Java_com_wangyz_ndk_MainActivity_stringFromJNI(

JNIEnv env,jobject / this */) {

int a = get();

LOG_I(“hello:%d”, a);

int b = hi();

LOG_I(“hi:%d”, b);

总结

开发是面向对象。我们找工作应该更多是面向面试。哪怕进大厂真的只是去宁螺丝,但你要进去得先学会面试的时候造飞机不是么?

作者13年java转Android开发,在小厂待过,也去过华为,OPPO等,去年四月份进了阿里一直到现在。等大厂待过也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

960页全网最全Android开发笔记

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
、阿里、美团等公司的面试题**,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

[外链图片转存中…(img-jryd9rnI-1715853830498)]

[外链图片转存中…(img-5fnum63R-1715853830502)]

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你关于在 Linux NDK交叉编译 SO 的问题。 在交叉编译 SO 之前,你需要先设置交叉编译环境。你可以使用以下命令来设置交叉编译环境: ``` ndk-build APP_ABI=armeabi-v7a NDK_TOOLCHAIN_VERSION=clang ``` 在这个命令中,`APP_ABI` 变量用来指定你要交叉编译的 ABI,这里我们选择了 `armeabi-v7a`,你可以根据你的需求选择其他 ABI。`NDK_TOOLCHAIN_VERSION` 变量用来指定你要使用的交叉编译工具链版本,这里我们选择了 `clang`,你也可以选择其他版本。 接下来,你需要编写一个 Makefile 文件来告诉交叉编译器如何编译你的 SO 。下面是一个简单的例子: ``` CROSS_COMPILE = $(NDK_TOOLCHAIN_PREFIX) CC = $(CROSS_COMPILE)gcc CFLAGS = -fPIC -Wall LDFLAGS = -shared LIB_SRC = my_lib.c LIB_OBJ = $(LIB_SRC:.c=.o) LIB_SO = libmy_lib.so all: $(LIB_SO) $(LIB_SO): $(LIB_OBJ) $(CC) $(LDFLAGS) -o $@ $< $(LIB_OBJ): $(LIB_SRC) $(CC) $(CFLAGS) -c $< -o $@ clean: rm -f $(LIB_SO) $(LIB_OBJ) ``` 在这个例子中,我们首先定义了交叉编译器前缀和编译器。在 `all` 目标中,我们告诉 Makefile 编译我们的 SO 文件。在 `$(LIB_SO)` 目标中,我们使用 `$(LDFLAGS)` 来告诉编译器生成一个共享文件。在 `$(LIB_OBJ)` 目标中,我们使用 `$(CFLAGS)` 来告诉编译器生成目标文件。 最后,你需要在 Linux NDK 中使用这个 Makefile 文件来交叉编译你的。你可以使用以下命令来交叉编译你的: ``` ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk ``` 在这个命令中,`NDK_PROJECT_PATH` 变量用来指定你的项目路径,`APP_BUILD_SCRIPT` 变量用来指定你的 Makefile 文件路径。 当编译完成后,你会在 `libs` 目录下找到你的 SO 文件。你可以将这个 SO 文件复制到你的应用程序中,并在代码中使用它。 希望这个回答能够帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值