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

问题描述:

我在某些android应用程序中构建了一个正在从JNI代码中调用的库(.so)。 JNI代码使用NDK构建。为什么我们需要使用android工具链(或NDK)来编译运行在android应用上下文中的c/C++代码?

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

如果我使用其他工具链构建库(在没有android应用程序的情况下在同一个ARM设备上使用),当从JNI代码调用时,库会崩溃。

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

+0

你试图使用什么其他工具链? – MuertoExcobito

+0

另一个工具链使用ARMv7的crosstool构建,并用于设备上的非android应用程序。 – sami

+0

你为什么要这样做?这样做很多工作,最后你只需要一部分NDK。 –

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

也许一个好的首发就是学习UBERTCLinaro Wiki

主要区别在于NDK编译器针对仿生(C运行时库的Android变体)进行了调整。最初,仿生是Linux运行时的一小部分。在最新的平台上,大部分差距都是封闭的,但现在有很多扩展可能需要。另外,Android动态链接器可能需要(取决于目标平台)由NDK binutils自动传递的一组ELF标志,如PIC,ID等。

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

请注意,NDK提供了一些工具来创建一个独立的工具链,其行为与您可能熟悉的其他工具链非常相似。这种方法可以很容易地采用具有复杂构建脚本的第三方库。

+0

尽管这些都是有效的,但我不确定他们是否讲述了整个故事。仿生学与其他大多数C库一样,使用相同的函数名称(函数存在的地方),所以潜在的问题是链接器应该修正的问题。您当然需要与现代Android版本的位置无关代码(PIC),但即使使用Google NDK工具链,您仍然必须传递命令行参数才能启用该代码。我并不反对你,但我怀疑其他事情也在发生。 –

+0

@KevinBoone当然,该手册的标题是[*如何使用非NDK工具链构建Android JNI库并避免在精神病院结束*](https://www.wikihow.com/Build-an-Android-JNI图书馆与非NDK工具链)仍然要写。幸运的是,OP只问'为什么?'。 –