android ndk linux,docker Android

大家好,感谢邀请,今天来为大家分享一下android ndk linux的问题,以及和docker Android的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

如何使用android的ndk编译器 编译c++的库

1.概述首先回顾一下 Android NDK开发中,Android.mk和 Application.mk各自的职责。
Android.mk,负责配置如下内容:(1)模块名(LOCAL_MODULE)(2)需要编译的源文件(LOCAL_SRC_FILES)(3)依赖的第三方库(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)(4)编译/链接选项(LOCAL_LDLIBS、LOCAL_CFLAGS)
Application.mk,负责配置如下内容:(1)目标平台的ABI类型(默认值:armeabi)(APP_ABI)(2) Toolchains(默认值:GCC 4.8)(3) C++标准库类型(默认值:system)(APP_STL)(4) release/debug模式(默认值:release)由此我们可以看到,本文所涉及的编译选项在Android.mk和Application.mk中均有出现,下面我们将一个个详细介绍。
2. APP_ABI
ABI全称是:Application binary interface,即:应用程序二进制接口,它定义了一套规则,允许编译好的二进制目标代码在所有兼容该ABI的操作系统和硬件平台中无需改动就能运行。(具体的定义请参考百度百科或者维基百科)由上述定义可以判断,ABI定义了规则,而具体的实现则是由编译器、CPU、操作系统共同来完成的。不同的CPU芯片(如:ARM、Intel x86、MIPS)支持不同的ABI架构,常见的ABI类型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。这就是为什么我们编译出来的可以运行于Windows的二进制程序不能运行于Mac OS/Linux/Android平台了,因为CPU芯片和操作系统均不相同,支持的ABI类型也不一样,因此无法识别对方的二进制程序。而我们所说的“交叉编译”的核心原理也跟这些密切相关,交叉编译,就是使用交叉编译工具,在一个平台上编译生成另一个平台上的二进制可执行程序,为什么可以做到?因为交叉编译工具实现了另一个平台所定义的ABI规则。我们在Windows/Linux平台使用Android NDK交叉编译工具来编译出Android平台的库也是这个道理。这里给出最新 Android NDK所支持的ABI类型及区别:那么,如何指定ABI类型呢?在 Application.mk文件中添加一行即可:
APP_ABI:= armeabi-v7a//只编译armeabi-v7a版本
APP_ABI:= armeabi armeabi-v7a//同时编译armeabi,armeabi-v7a版本
APP_ABI:= all//编译所有版本
3. LOCAL_LDLIBS
Android NDK除了提供了Bionic libc库,还提供了一些其他的库,可以在 Android.mk文件中通过如下方式添加依赖:
LOCAL_LDLIBS:=-lfoo其中,如下几个库在 Android NDK编译时就默认链接了,不需要额外添加在 LOCAL_LDLIBS中:(1) Bionic libc库(2) pthread库(-lpthread)(3) math(-lmath)(4) C++ support library(-lstdc++)下面我列了一个表,给出了可以添加到“LOCAL_LDLIBS”中的不同版本的Android NDK所支持的库:下面是我总结的一些常用的CFLAGS编译选项:(1)通用的编译选项-O2编译优化选项,一般选择O2,兼顾了优化程度与目标大小-Wall打开所有编译过程中的Warning-fPIC编译位置无关的代码,一般用于编译动态库-shared编译动态库-fopenmp打开多核并行计算,-Idir配置头文件搜索路径,如果有多个-I选项,则路径的搜索先后顺序是从左到右的,即在前面的路径会被选搜索-nostdinc该选项指示不要标准路径下的搜索头文件,而只搜索-I选项指定的路径和当前路径。--sysroot=dir用dir作为头文件和库文件的逻辑根目录,例如,正常情况下,如果编译器在/usr/include搜索头文件,在/usr/lib下搜索库文件,它将用dir/usr/include和dir/usr/lib替代原来的相应路径。-llibrary查找名为library的库进行链接-Ldir增加-l选项指定的库文件的搜索路径,即编译器会到dir路径下搜索-l指定的库文件。-nostdlib该选项指示链接的时候不要使用标准路径下的库文件(2) ARM平台相关的编译选项-marm-mthumb二选一,指定编译thumb指令集还是arm指令集-march=name指定特定的ARM架构,常用的包括:-march=armv6,-march=armv7-a-mfpu=name给出目标平台的浮点运算处理器类型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16-mfloat-abi=name给出目标平台的浮点预算ABI,支持的参数包括:“soft”,“softfp” and“hard”

深入Linux环境下NDK的配置方法linux配置ndk

《深入Linux环境下NDK的配置方法》

Linux环境下的NDK(Native Development Kit)是一种开发工具,它使开发者能够使用C和C++编写针对Android设备的原生应用程序。在此文中,我们将详细介绍如何在Linux环境下配置NDK。

第一步:下载并安装NDK。下载最新版本的Android NDK,按照官方文档指导安装即可。如果要使用不同版本的NDK,请下载女性对应版本的文件并完成安装。

第二步:配置环境变量。配置NDK的环境变量很重要,它将是以后使用NDK的基础。执行下面的指令,把NDK的路径添加到PATH环境变量中:

export NDK_ROOT=[ndk install path]

export PATH=$NDK_ROOT:$PATH

如果要在终端中添加长期可使用的路径,请在.profile文件中添加上面的指令,并执行:

source~/.profile

第三步:安装NDK工具。安装完NDK之后,需要安装相关的NDK工具,包括:make,gcc,gdb等。使用如下指令查看是否已安装:

which make

which gcc

如果返回的信息是一个空,则表示这些工具都没有安装。下载一个可执行文件并运行它以完成安装:make– v;gcc-v;gdb-v。

第四步:编写和编译C/C++项目。完成上述步骤之后,现在可以使用Android NDK开发应用了。使用以下指令编译所有C/C++源文件:

ndk-build

该指令会生成编译后的可执行文件,如果有任何错误,可以再次检查上述步骤,确保未出错。

以上是Linux环境中NDK的配置方法。配置完成后,可以利用NDK开发丰富多彩的Android原生应用程序。此外,也可以借助官方文档和支持社区了解更多有关NDK的信息。

如何定位Android NDK开发中遇到的错误

只要你细心的查看,再配合Google提供的工具,完全可以快速地准确定位出错的代码位置,这个工作我们称之为“符号化”。需要注意的是,如果要对NDK错误进行符号化的工作,需要保留编译过程中产生的包含符号表的so文件,这些文件一般保存在$PROJECT_PATH/obj/local/目录下。

第一种方法:ndk-stack

这个命令行工具包含在NDK工具的安装目录,和ndk-build及其他常用的一些NDK命令放在一起,比如在我的电脑上,其位置是/android-ndk-r9d/ndk-stack。根据Google官方文档,NDK从r6版本开始提供ndk-stack命令,如果你用的之前的版本,建议还是尽快升级至最新的版本。使用ndk–stack命令也有两种方式

实时分析日志

在运行程序的同时,使用adb获取logcat日志,并通过管道符输出给ndk-stack,同时需要指定包含符号表的so文件位置;如果你的程序包含了多种CPU架构,在这里需求根据错误发生时的手机CPU类型,选择不同的CPU架构目录,如:

当崩溃发生时,会得到如下的信息:

第二种方法:使用addr2line和objdump命令

这个方法适用于那些不满足于上述ndk-stack的简单用法,而喜欢刨根问底的程序员们,这两个方法可以揭示ndk-stack命令的工作原理是什么,尽管用起来稍微麻烦一点,但可以稍稍满足一下程序员的好奇心。

先简单说一下这两个命令,在绝大部分的Linux发行版本中都能找到他们,如果你的操作系统是Linux,而你测试手机使用的是Intel x86系列,那么你使用系统中自带的命令就可以了。然而,如果仅仅是这样,那么绝大多数人要绝望了,因为恰恰大部分开发者使用的是Windows,而手机很有可能是armeabi系列。

在NDK中自带了适用于各个操作系统和CPU架构的工具链,其中就包含了这两个命令,只不过名字稍有变化,你可以在NDK目录的toolchains目录下找到他们。以我的Mac电脑为例,如果我要找的是适用于armeabi架构的工具,那么他们分别为arm-linux-androideabi-addr2line和arm-linux-androideabi-objdump;位置在下面目录中,后续介绍中将省略此位置:

假设你的电脑是Windows系统,CPU架构为mips,那么你要的工具可能包含在一下目录中:

接下来就让我们来看看如何使用这两个工具,下面具体介绍。

找到日志中的关键函数指针

其实很简单,就是找到backtrace信息中,属于我们自己的so文件报错的行。

首先要找到backtrace信息,有的手机会明确打印一行backtrace(比如我们这次使用的手机),那么这一行下面的一系列以“#两位数字 pc”开头的行就是backtrace信息了。有时可能有的手机并不会打印一行backtrace,那么只要找到一段以“#两位数字 pc”开头的行,就可以了。

其次要找到属于自己的so文件报错的行,这就比较简单了。找到这些行之后,记下这些行中的函数地址。

阅读剩余
THE END