gpt4 book ai didi

android - 如何在 native 库中使用 cpu-feature?

转载 作者:搜寻专家 更新时间:2023-11-01 07:45:10 25 4
gpt4 key购买 nike

我们最近添加了 cpu-features 来检测平台功能,例如 ARMV8 和 CRC、AES 和 SHA。我们抓到一个bug report用于针对最新的 NDK 进行构建。当我们尝试包含 <cpu-features.h>armeabi项目结果:

$ make -f GNUmakefile-cross
arm-linux-androideabi-g++ -DNDEBUG -g2 -O3 -fPIC -pipe -march=armv5te -mtune=xscale -mthumb -msoft-float
-funwind-tables -fexceptions -frtti -DANDROID --sysroot=/opt/android-ndk/platforms/android-21/arch-arm
-Wa,--noexecstack -I/opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.9/include
-I/opt/android-ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/include -c cpu.cpp
In file included from cpu.cpp:26:0:
/opt/android-ndk/platforms/android-21/arch-arm/usr/include/machine/cpu-features.h:52:6: error:
# error Unknown or unsupported ARM architecture
^
cpu.cpp: In function 'bool CryptoPP::CPU_QueryNEON()':
cpu.cpp:402:29: error: 'android_getCpuFeatures' was not declared in this scope
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
^
cpu.cpp:402:33: error: 'ANDROID_CPU_ARM_FEATURE_NEON' was not declared in this scope
if (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON)
^
make: *** [cpu.o] Error 1

CXXFLAGS我们使用的是直接来 self 几年前创建的 JNI 项目。我用了ndk-build检查 Android 的构建系统集的标志,然后将它们传输到我们的脚本。我们不是在编造它们;它们是官方的 NDK 编译器选项。

当我 cat标题 cpu-features.h我看到一个不祥的征兆:

/* __ARM_ARCH__ is a number corresponding to the ARM revision
* we're going to support. Our toolchain doesn't define __ARM_ARCH__
* so try to guess it.
*/
#ifndef __ARM_ARCH__
# if defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ || \
defined __ARM_ARCH_7R__ || defined __ARM_ARCH_7M__
# define __ARM_ARCH__ 7
# elif defined __ARM_ARCH_6__ || defined __ARM_ARCH_6J__ || \
defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6Z__ || \
defined __ARM_ARCH_6KZ__ || defined __ARM_ARCH_6T2__
# define __ARM_ARCH__ 6
# else
# error Unknown or unsupported ARM architecture
# endif
#endif

我们似乎在流程和实现中遗漏了一些东西。首先,所有需要的定义都由预处理器提供(见下文)。预处理器提供 __ARM_ARCH ,但 Android 的 header 会检查 __ARM_ARCH__ .

第二,<machine/cpu-features.h>似乎不包括所需的声明:

$ cat /opt/android-ndk/platforms/android-21/arch-arm/usr/include/machine/cpu-features.h | grep -i android_getCpuFeatures
$

我们不使用 Android 的构建系统,因此适用的很少:The cpufeatures Library .它的级别也太高,缺少我们需要的一些细节。

我的问题是,我们如何在常规 native 库中使用 cpu-features?对于第一个和第二个问题,我们缺少什么?


我们的脚本集 CXX , CXXFLAGS等。一旦脚本被获取,它们就可以使用。在这种情况下:

$ echo $CXX
arm-linux-androideabi-g++

和:

$ $CXX -dM -E - </dev/null | sort
#define __ACCUM_EPSILON__ 0x1P-15K
#define __ACCUM_FBIT__ 15
#define __ACCUM_IBIT__ 16
#define __ACCUM_MAX__ 0X7FFFFFFFP-15K
#define __ACCUM_MIN__ (-0X1P15K-0X1P15K)
#define __ANDROID__ 1
#define __APCS_32__ 1
#define __arm__ 1
#define __ARM_32BIT_STATE 1
#define __ARM_ARCH 5
#define __ARM_ARCH_5TE__ 1
#define __ARM_ARCH_ISA_ARM 1
#define __ARM_ARCH_ISA_THUMB 1
#define __ARM_EABI__ 1
#define __ARMEL__ 1
#define __ARM_FEATURE_CLZ 1
#define __ARM_FEATURE_DSP 1
#define __ARM_FEATURE_QBIT 1
#define __ARM_FP 12
#define __ARM_NEON_FP 4
#define __ARM_PCS 1
#define __ARM_SIZEOF_MINIMAL_ENUM 4
#define __ARM_SIZEOF_WCHAR_T 4
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_CONSUME 1
#define __ATOMIC_RELAXED 0
#define __ATOMIC_RELEASE 3
#define __ATOMIC_SEQ_CST 5
#define __BIGGEST_ALIGNMENT__ 8
#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
...

似乎没有声明或定义任何 cpu 功能:

$ echo $AOSP_SYSROOT
/opt/android-ndk/platforms/android-21/arch-arm
$ grep -IR android_getCpuFeatures $AOSP_SYSROOT
$ grep -IR ANDROID_CPU_ARM_FEATURE_NEON $AOSP_SYSROOT
$

最佳答案

该库不是作为 NDK 的一部分预构建的,而是作为源代码提供的。当使用 ndk-build 构建时,这个库可以通过引用自动构建,但是当使用外部构建系统时,您需要确保自己包含并构建它。

源代码在 android-ndk/sources/android/cpufeatures 中,您会在那里找到一个不同的 cpu-features.h。 (为了找到您找到的那个,您可能包含了 machine/cpu-features.h,这是完全不同的事情。)

所以你需要包含 android-ndk/sources/android/cpufeatures 中的 cpu-features.h 并构建 cpu-features.c 作为构建过程的一部分。或者,如果您正在生成一个静态库,那么根据此 header 构建代码就足够了,并记录该库的用户在生成最终共享库时需要包含 cpufeatures 库.

关于android - 如何在 native 库中使用 cpu-feature?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com