首页 文章

Android NDK eabi - 如何让ndk知道使用硬fp?

提问于
浏览
4

我已经使用“-mfloat-abi = hard”参数预构建了库(libxxx.so) . 现在我想用这个lib编译我的本机代码,并用ndk构建共享库(.so) .

Application.mk:

APP_ABI:= armeabi-v7a

Android.mk:

LOCAL_PATH:= $(调用my-dir)包括$(CLEAR_VARS)LOCAL_MODULE:= xxx LOCAL_SRC_FILES:= libxxx.so include $(CLEAR_VARS)LOCAL_MODULE:= xxx_wrapper LOCAL_SRC_FILES:= xxx_wrapper.cpp xxx_wrapper.h LOCAL_SHARED_LIBRARIES := xxx LOCAL_C_INCLUDES:= / softdev / host / include / LOCAL_LDLIBS:= -L $(SYSROOT)/ usr / lib -llog LOCAL_ARM_NEON:= true LOCAL_CXXFLAGS = -mfpu = vfp -mfloat-abi = hard LOCAL_CFLAGS = -mfpu = vfp -mfloat-abi = hard include $(BUILD_SHARED_LIBRARY)

ndk-build 我收到一个错误:

/softdev/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ . ./../arm-linux-androideabi/bin/ld:错误:/Users/asmirnov/Documents/dev/src/project/obj/local/armeabi-v7a/objs-debug/xxx_wrapper/xxx_wrapper.o使用VFP寄存器参数,输出不/softdev/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../ ../../../arm-linux-androideabi/bin/ld:错误:/Users/asmirnov/Documents/dev/src/project/obj/local/armeabi-v7a/libxxx.so使用VFP寄存器参数,输出不收集2:ld返回1退出状态

我该如何解决?根据输出,两个.o文件都是硬浮动的,我无法弄清楚“输出”是什么意思?我在模块描述中添加了'-mfpu = vfp -mfloat-abi = hard' .

更新:我已经执行了ndk-build V = 1并且在命令行中没有找到“-mfpu = vfp -mfloat-abi = hard”参数,所以我试图手动完成(但仍然没有结果):

mba-anton:build asmirnov $ /softdev/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/arm-linux-androideabi-g
-Wl,-soname,libxxx_wrapper.so -shared --sysroot = / softdev / android-ndk-r8e / platforms / android-8 / arch-arm / Users / asmirnov / Documents / dev / src / xxx_jni / obj / local / armeabi-v7a / objs-debug / xxx_wrapper / xxx_wrapper.o / Users / asmirnov / Documents / dev / src / xxx_jni / obj / local / armeabi-v7a / libstdc .a -lgcc / Users / asmirnov / Documents / dev / src / xxx_jni / obj / local / armeabi-v7a / libxxx.so -no-canonical-prefixes -march = armv7-a -mfpu = vfp -mfloat-abi = hard -Wl, - fix-cortex-a8 -Wl, - no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -L / softdev / android-ndk-r8e / platforms / android-8 / arch-arm / usr / lib -L / usr / lib -llog -lstdc -lc -lm -o /Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/libxxx_wrapper.so / softdev / android-ndk-r8e / toolchains / arm -linux-androideabi-4.6 /预建/达尔文86 / bin中/../ LIB / GCC /臂-Linux的androideabi / 4.6 /../../../../臂-Linux的androideabi / bin中/ ld:错误:/Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/objs-debug/xxx_wrapper/xxx_wrapper.o使用VFP寄存器参数,输出做es not /softdev/android-ndk-r8e/toolchains/arm-linux-androideabi-4.6/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../ ../../arm-linux-androideabi/bin/ld:错误:/Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/libxxx.so使用VFP寄存器参数,输出不collect2:ld返回1退出状态

2 回答

  • 1

    你可能想要这个:-march = armv7-a -mfloat-abi = softfp -mfpu = vfp

    总之,“-mfloat-abi = hard”或“-mfloat-abi = softfp”参数并不是指使用硬件或软件FPU .

    有关详细信息,请参阅Getting hardware floating point with android NDK,fadden给出了一个清晰明确的答案,所以我不打算在此重复 .

  • 1

    解:

    APP_ABI := armeabi-v7a-hard

    代替

    APP_ABI := armeabi-v7a

    您还可以在Android.mk中添加这些标志:

    LOCAL_CXXFLAGS  := -O2 -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -march=armv7-a -mfloat-abi=hard
    LOCAL_CFLAGS    := -O2 -mfpu=vfpv3-d16 -mhard-float -D_NDK_MATH_NO_SOFTFP=1 -march=armv7-a -mfloat-abi=hard
    LOCAL_LDFLAGS   := -lm_hard
    

相关问题