未加星标

使用 NDK 移植 Linux C/C++ 程序到 Android 系统

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2018 | 作者 红领巾 ] 0人收藏点击收藏
区分基础概念:JNI 与 NDK JNI(Java Native Interface)是一种 Java 语言特性

用于 Java 程序与 C、C++ 库间的互相调用。

NDK(Native Development Kit)是 Google 提供的使用 C/C++ 编写 Android 程序的开 发工具包

它使用 JNI 实现 Java 程序调用 C/C++ 本地代码,允许 C/C++ 本地代码访问 Android API,不只是用来开发或移植 C/C++ 库,也可以是 C/C++ 程序。

引用自 Android NDK | Android NDK | Android Developers

Android NDK The Android NDK is a toolset that lets you implement parts of your app in native code, using languages such as C and C++. For certain types of apps, this can help you reuse code libraries written in those languages.

NDK 交叉编译工具链适用于使用 GNU Autotools 进行构建的项目

NDK 自带完整的交叉编译工具链,可以直接将使用 GNU Autotools 构建的一些开源库移植 到 Android 平台,这样可以省去自已去写 Android.mk 编译脚本。

通常只需要先设置以下环境变量:

export PATH=$PATH:/opt/android-toolchain/bin export CC=aarch64-linux-android-clang export CXX=aarch64-linux-android-clang++ export LD=aarch64-linux-android-ld export AR=aarch64-linux-android-ar export STRIP=aarch64-linux-android-strip export RANLIB=aarch64-linux-android-ranlib export AS=aarch64-linux-android-clang export CFLAGS="-fPIE -fPIC" export LDFLAGS="-pie" export SYSROOT=/opt/android-toolchain/sysroot export CROSS_COMPILE_HOST=aarch64-linux-android

然后在执行 ./configure 时指定 --host=${CROSS_COMPILE_HOST} 选项即可编译成功。

NDK 的局限性

NDK 提供一系列稳定的 C/C++ API,头文件在 sysroot/usr/include 下,主要包括 C 标 准库、C++ 标准库、jni、math、pthread、zlib、OpenGL、Android 相关的库。随着时间的推 移 NDK 支持的 API 也在增加。

除了支持 Android 开发之外,NDK 开发环境只是嵌入式 Linux 开发环境的一个子集,这可 能是因为 Android 安全沙箱需要、GPL 版权限制。

没有使用 glibc

glibc 是 Linux 下的 C 标准库实现,除了实现 ANSI C 标准库还有大量方便 Linux 开发的扩展功能。而 NDK 提供的 C 标准库并非 glibc 。这导致移植 Nginx 时由于缺少 crypt.h 头文件而编译不过。如果强行将 glibc 之类的东西也移植过来我估计后面也 很难打包成 APK 从而正常地进行安装、升级。

NDK 将在未来的版本中移除 gcc 而只支持 clang ,已知 Standalone 工具链中使用 gcc 会 出现编译错误 :

cstddef:43:25: fatal error: stddef.h: No such file or directory

初步使用 clang 移植了一些库(如 pcre )是没有问题的。

结论

一般的 C/C++ 库通常本身就会注重可移植性,不会生硬地依赖系统底层特性,使用 NDK 移植是可行的,即使是 ffmpeg 这种大型的库也可以成功移植到 Android。

而对于一些 Linux 下的程序,使用 NDK 直接移植会有很大的失败机率,因为他们可能 使用了 NDK 不支持的特性(如 glibc ),应该采用和 Android 源代码一起编译的方 式,这样可以使用 NDK 不支持的特性。

参考 Concepts | Android NDK | Android Developers Android NDK vs AOSP Build System Android NDK Native APIs | Android NDK | Android Developers Building an Android* Command-Line Application Using the NDK Build Tools | Intel Software Android NDK开发扫盲及最新CMake的编译使用 - 简书 在命令行下用cmake交叉编译可在android中运行的so包 - CSDN博客 cmake使用独立工具链交叉编译可在android中运行的so包 - CSDN博客 Building Open Source libraries with Android NDK | Thoughts and Ideas In Warped Times

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

tags: NDK,Android,android,C++,aarch64,linux,编译,移植,glibc,Linux,Java,export,API,Native
分页:12
转载请注明
本文标题:使用 NDK 移植 Linux C/C++ 程序到 Android 系统
本站链接:https://www.codesec.net/view/586438.html


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(75)