首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓系统,霓虹灯和非霓虹灯的建设

安卓系统,霓虹灯和非霓虹灯的建设
EN

Stack Overflow用户
提问于 2011-10-06 19:21:33
回答 5查看 24.6K关注 0票数 13

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

所以,如果android构建系统没有过分的侵扰性,我就不用问问题了,但我似乎没有办法为armv6编译一个文件,为arm7 7 neon编译另一个文件。

如果可行的话,有人能给出任何线索吗?

编辑

在尝试回复和浪费互联网墨水之前,应该清楚的是以下几点:

1)只生成一个库。

2)在armv6 (pre neon设备,例如armeabi)上运行的构建。

3)允许此构建还包含霓虹灯代码(可以基于运行时cpu检测来执行;cpu检测超出了问题的范围)。

4)霓虹灯代码来自一个c/cpp文件,它是使用NEON本质编写的。

忽略了这些要求的任何部分,完全失去了问题的意义。

EN

回答 5

Stack Overflow用户

发布于 2012-06-12 15:46:43

如果您将霓虹灯代码放在单独的模块(静态库或共享库)中,您可以手动调整CFLAGS在Android.mk中用于该模块的以满足您的需要。

如果C文件在本质上使用#ifdef __ARM_NEON__,那么最好的选择是将这些文件放在共享库中--一个是为v6编译的,另一个是为neon编译的。

我通常直接从Java加载这种“可供选择的”库,这样主要的本机代码根本不关心这些更改。

更新:这里是一个使用静态库的简单示例:

Android.mk

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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);
}
票数 4
EN

Stack Overflow用户

发布于 2012-03-27 01:11:03

使用此链接http://www.kandroid.org/ndk/docs/CPU-ARM-NEON.html

您可以使用.neon文件后缀选择性地构建具有霓虹灯支持的某些源文件。希望你能知道这是否适用于ABI选择..。

您可以将霓虹灯代码路径放置在一个文件中,并使用上面所示的make文件条件来构建正确的文件,而ABI正是基于该文件进行的。

票数 2
EN

Stack Overflow用户

发布于 2011-10-06 19:32:57

文档中的这个片段可能会有所帮助:

代码语言:javascript
运行
复制
   # 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,它将完全跳过它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7679363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档