我已经使用“-mfloat-abi=hard”参数预构建库 (libxxx.so)。现在我想用这个库编译我的 native 代码并用 ndk 构建共享库 (.so)。
应用程序.mk:
APP_ABI := armeabi-v7a
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := xxx
LOCAL_SRC_FILES := libxxx.so
include $(PREBUILT_SHARED_LIBRARY)
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: error: /Users/asmirnov/Documents/dev/src/project/obj/local/armeabi-v7a/objs-debug/xxx_wrapper/xxx_wrapper.o uses VFP register arguments, output does 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: error: /Users/asmirnov/Documents/dev/src/project/obj/local/armeabi-v7a/libxxx.so uses VFP register arguments, output does not collect2: ld returned 1 exit status
我该如何解决?根据输出,这两个 .o 文件都是硬 float 的,我不知道“输出”是什么意思?我已将“-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/prebuilt/darwin-x86/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld: error: /Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/objs-debug/xxx_wrapper/xxx_wrapper.o uses VFP register arguments, output does 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: error: /Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/libxxx.so uses VFP register arguments, output does not collect2: ld returned 1 exit status
最佳答案
你可能想要这个: -march=armv7-a -mfloat-abi=softfp -mfpu=vfp
总之,“-mfloat-abi=hard”或“-mfloat-abi=softfp”参数不是指使用硬件或软件FPU。
请参阅Getting hardware floating point with android NDK关于更多细节,fadden 已经给出了非常明确的答案,所以我不会在这里重复。
关于Android NDK eabi - 如何让 ndk 知道使用 hard fp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19256461/