android - 为什么我们需要使用 android 工具链(或 NDK)来编译在 android 应用程序上下文中运行的 c/c++ 代码?

标签 android c++ c android-ndk

我构建了一个库 (.so),它在某些 Android 应用程序中被 JNI 代码调用。 JNI 代码是使用 NDK 构建的。

如果我使用 android 工具链构建库,则该库在从 JNI 代码调用时运行良好。

如果我使用另一个工具链(在同一 ARM 设备上用于非 android 应用程序)构建库,则库在从 JNI 代码调用时崩溃。

为什么我们需要使用 android 工具链(或 NDK)来编译在 android 应用程序上下文中运行的 c/c++ 代码?为什么不使用其他工具链?

最佳答案

您可以使用其他工具链,但需要特别小心。

也许一个好的开始是学习 UBERTCLinaro Wiki .

主要区别在于 NDK 编译器针对仿生(C 运行时库的 Android 变体)进行了调整。最初,仿生是 Linux 运行时的一个适度子集。在最新的平台上,大部分差距已经缩小,但现在您可能需要许多扩展。

此外,Android 动态链接器可能需要(取决于目标平台)一组由 NDK binutils 自动提供的 ELF 标志,例如 PIC、id 等。

很有可能使用 arm-linux 工具链来构建将在 Android 上运行的静态链接可执行文件,但对于必须在 JNI 环境中良好运行的库来说,这种努力可能不值得。

请注意,NDK 提供了创建独立工具链的工具,其行为与您可能熟悉的其他工具链非常相似。这种方法使得采用具有复杂构建脚本的第 3rd 方库变得容易。

关于android - 为什么我们需要使用 android 工具链(或 NDK)来编译在 android 应用程序上下文中运行的 c/c++ 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801979/

相关文章:

比较插入排序算法的先前数组元素

c - 从尾到头反转双向链表

android - 如何修复向 Google 日历添加事件时出现的 "Error connecting with login URI"异常?

c++ - Qt 5.5 - 触摸屏事件仅在初始(第一个)窗口中工作

android - Gradle - "enforceUniquePackageName"版本 3.0.0+ 已弃用?

c++ - 为什么会跳出程序?

c++ - 模棱两可的函数模板

c - 返回一个指针作为函数参数

Android,Admob/Adview takes|steals focus from edittext,如何预防?

android - Android Q 中的深色主题配置更改