Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android本机代码如何针对多个处理器类型?_Android_Performance_Android Ndk_Native Code - Fatal编程技术网

Android本机代码如何针对多个处理器类型?

Android本机代码如何针对多个处理器类型?,android,performance,android-ndk,native-code,Android,Performance,Android Ndk,Native Code,据我所知,Android上的本机代码是直接与特定设备的处理器协同工作的代码。因此,如果我想利用某个处理器,我会使用本机代码 但是,如果我想制作一个包含本机代码但面向多个处理器的应用程序,会发生什么呢 我是否必须制作多个应用程序,每个架构一个?或者有没有一种方法可以将多个版本的本机代码放在一个应用程序中,选择与它运行的设备的处理器匹配的应用程序?这通常被称为交叉编译。也就是说,你需要一个编译器,而不是为Y编译你当前的代码X。它为CPU Y生成代码,而不是像通常情况那样为X生成代码。Android本

据我所知,Android上的本机代码是直接与特定设备的处理器协同工作的代码。因此,如果我想利用某个处理器,我会使用本机代码

但是,如果我想制作一个包含本机代码但面向多个处理器的应用程序,会发生什么呢


我是否必须制作多个应用程序,每个架构一个?或者有没有一种方法可以将多个版本的本机代码放在一个应用程序中,选择与它运行的设备的处理器匹配的应用程序?

这通常被称为交叉编译。也就是说,你需要一个编译器,而不是为Y编译你当前的代码X。它为CPU Y生成代码,而不是像通常情况那样为X生成代码。

Android本机开发工具包是一套交叉编译器和支持库,可用于生成针对一个或多个官方支持的Android架构的共享对象(.so)文件

Android应用程序包(.apk)专用的zip文件格式允许为多个体系结构包含不同的本机库


如果参考NDK文档,您将看到有一个项目配置文件,可用于指定本机代码应编译以支持的体系结构。

只有在开发NDK应用程序时,您才需要以多CPU体系结构为目标。 在jni文件夹下创建一个名为“Application.mk”的文件。添加此参数 阿普阿比= 例子: APP_ABI:=x86 armv7eabi mips 或者你们都可以这样做 APP_ABI:=all(它将为所有受支持的体系结构创建apk)
但这样做会生成一个胖二进制文件,当用户安装应用程序时,google play会根据不同的底层架构过滤相应的apk

我重新措辞了你的问题,使你的问题更清楚。如果我误解了你,请随时回复。元讨论。也许你误解了这个问题。这与交叉编译无关,而是针对多个CPU架构。看克里斯的答案。@Kevin-不,这个答案写得很对,虽然有点简短。交叉编译是必要的每目标编译步骤的实用形式,需要从单个源支持多个本机架构。Android NDK是一套交叉编译器,允许桌面操作系统交叉编译各种Android架构。@Kevin-这不是问题所问的问题。从一开始,问题就非常明确地涉及支持多个本机架构(明确说明了“本机”的含义)。这需要多个编译器,实际上是交叉编译器。@Kevin几乎所有android开发都是“交叉编译”,因为桌面通常用于构建针对移动架构(或独特的DVM)的代码,这与构建系统有很大不同。这个问题中的“不同”显然不是指这种差异,而是指Android生态系统中目前存在的各种本机架构(引用原文中的“特定设备的处理器”)(两种ARM、MIPS、x86等)。每一个都需要自己的(交叉)编译器来生成适当的本机代码。@kevin-我明白你的意思,我只是没有被需要交叉编译器和需要几个编译器之间的差异绊倒,特别是在这种情况下,几个编译器一起分布在同一个NDK工具链包中。我同意这个答案的内容并不足够。