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

sam*_*ami 1 c c++ android android-ndk

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

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

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

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

Ale*_*ohn 5

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

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

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

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

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

请注意,NDK 提供了用于创建独立工具链的工具,其行为与您可能熟悉的其他工具链非常相似。这种方法可以轻松采用具有复杂构建脚本的第三方