我想为armv6构建我的库,如果设备支持它,我会在运行时启用一些neon代码。霓虹灯代码使用neon本质,为了能够编译它,我必须启用armeabi-v7a,但这会影响常规c代码(在一些低端设备上会损坏)。
所以,如果android构建系统没有过分的侵扰性,我就不用问问题了,但我似乎没有办法为armv6编译一个文件,为arm7 7 neon编译另一个文件。
如果可行的话,有人能给出任何线索吗?
编辑
在尝试回复和浪费互联网墨水之前,应该清楚的是以下几点:
1)只生成一个库。
2)在armv6 (pre neon设备,例如armeabi)上运行的构建。
3)允许此构建还包含霓虹灯代码(可以基于运行时cpu检测来执行;cpu检测超出了问题的范围)。
4)霓虹灯代码来自一个c/cpp文件,它是使用NEON本质编写的。
忽略了这些要求的任何部分,完全失去了问题的意义。
发布于 2012-06-12 15:46:43
如果您将霓虹灯代码放在单独的模块(静态库或共享库)中,您可以手动调整CFLAGS在Android.mk中用于该模块的以满足您的需要。
如果C文件在本质上使用#ifdef __ARM_NEON__,那么最好的选择是将这些文件放在共享库中--一个是为v6编译的,另一个是为neon编译的。
我通常直接从Java加载这种“可供选择的”库,这样主要的本机代码根本不关心这些更改。
更新:这里是一个使用静态库的简单示例:
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := neon_utils
LOCAL_SRC_FILES := neon_add.c
LOCAL_CFLAGS += -mfloat-abi=softfp -mfpu=neon -march=armv7
include $(BUILD_STATIC_LIBRARY)
NDK_PATH:=$(call my-dir)/../..
include $(CLEAR_VARS)
LOCAL_MODULE := test_conditional_load
LOCAL_C_INCLUDES := $(NDK_PATH)/sources/cpufeatures
LOCAL_SRC_FILES := main.c
LOCAL_STATIC_LIBRARIES := neon_utils cpufeatures
include $(BUILD_EXECUTABLE)
include $(NDK_PATH)/sources/cpufeatures/Android.mk
main.c
#include <stdio.h>
#include <cpu-features.h>
void neon_add(int32_t * ptr);
int main()
{
int32_t int32_4[] = {2,3,4,5};
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
{
neon_add(int32_4);
printf("neon\n");
}
else
{
printf("not neon\n");
}
printf("values = %d, %d, %d, %d\n", int32_4[0], int32_4[1], int32_4[2], int32_4[3]);
return 0;
}
neon_add.c
#include <arm_neon.h>
void neon_add(int32_t * ptr)
{
int32x4_t vin = vld1q_s32(ptr);
int32x4_t vout = vaddq_s32(vin, vin);
vst1q_s32(ptr, vout);
}
发布于 2012-03-27 01:11:03
使用此链接http://www.kandroid.org/ndk/docs/CPU-ARM-NEON.html
您可以使用.neon文件后缀选择性地构建具有霓虹灯支持的某些源文件。希望你能知道这是否适用于ABI选择..。
您可以将霓虹灯代码路径放置在一个文件中,并使用上面所示的make文件条件来构建正确的文件,而ABI正是基于该文件进行的。
发布于 2011-10-06 19:32:57
文档中的这个片段可能会有所帮助:
# define a static library containing our NEON code
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib-neon
LOCAL_SRC_FILES := mylib-neon.c
LOCAL_ARM_NEON := true
include $(BUILD_STATIC_LIBRARY)
endif # TARGET_ARCH_ABI == armeabi-v7a
这仅在使用armeabi-v7a时编译mylib-neon,即使您对各种ABIs使用相同的Android.mk文件。对于armeabi v6,它将完全跳过它。
https://stackoverflow.com/questions/7679363
复制相似问题