Android构建系统,NEON和非NEON构建

Pav*_*l P 12 android arm neon android-ndk

我想为armv6构建我的库,如果设备支持它,我会在运行时启用一些霓虹灯代码.霓虹灯代码使用霓虹内在函数,为了能够编译它,我必须启用armeabi-v7a,但这会影响常规的c代码(它在一些低端设备上会被破坏).

因此,如果android构建系统没有过度干扰,我就不必提问,但似乎我没有办法为armv6编译一个文件而为arm7-neon编译另一个文件.

任何人都可以提供任何线索,如果这是可行的吗?

编辑
在尝试回复和浪费互联网墨水之前,应该清楚这些是要点:
1)只创建一个lib.
2)使构建在armv6(pre-neon设备,例如armeabi)上运行.
3)允许此构建还包含NEON代码(可以基于运行时cpu检测执行; cpu检测超出了问题的范围).
4) NEON代码来自ac/cpp文件,使用neon intrinsics编写.

省略这些要求的任何部分完全失去了问题的重点

Ale*_*ohn 12

我最近找到了解决NDK局限性的另一种方法.我的案子与NEON无关,但对你而言,同样的黑客可以胜任这项工作.

诀窍是使用NDK的现有"标记"机制CFLAGS为一堆文件指定特殊.这是你如何做到的:

首先,列出霓虹灯特定的来源.您不能使用docs/CPU-ARM-NEON.html中.neon描述的后缀,因为build-binary.mk会发现您没有定位到armeabi-v7a.我使用以下技术:

LOCAL_NEON_SRC_FILES := imgproc/neon_utils.c \
                        videoproc/usingneon.cpp
LOCAL_SRC_FILES := main.c \
                   imgproc/img.c \
                   videoproc/video.cpp

LOCAL_SRC_FILES += $(LOCAL_NEON_SRC_FILES)
Run Code Online (Sandbox Code Playgroud)

现在,CFLAGS为NEON 定义:

LOCAL_NEON_CFLAGS := -mfloat-abi=softfp -mfpu=neon -march=armv7
Run Code Online (Sandbox Code Playgroud)

最后,将以下神奇的行添加到Android.mk:

TARGET-process-src-files-tags += $(call add-src-files-target-cflags, $(LOCAL_NEON_SRC_FILES), $(LOCAL_NEON_CFLAGS))
Run Code Online (Sandbox Code Playgroud)

如果要构建多个二进制文件,则可能需要$(LOCAL_NEON_SRC_FILES)重置

include $(CLEAR_VARS)
Run Code Online (Sandbox Code Playgroud)

为此,请将以下内容添加到您的Android.mkApplication.mk:

modules-LOCALS += NEON_SRC_FILES
Run Code Online (Sandbox Code Playgroud)

注意:我没有为NEON尝试过这种魔法,我需要它用于完全不同的目的.您可能需要进行一些调整才能为文件和项目实现所需的编译选项.我正在使用NDK r.8b,我没有检查这是否适用于早期(或更高版本)版本.