5

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

应用程序.mk:

APP_ABI := armeabi-v7a

安卓.mk:

LOCAL_PATH := $(调用我的目录)

包括 $(CLEAR_VARS)

本地模块:= xxx

LOCAL_SRC_FILES := libxxx.so

包括 $(PREBUILT_SHARED_LIBRARY)

包括 $(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 := 真

LOCAL_CXXFLAGS += -mfpu=vfp -mfloat-abi=hard

LOCAL_CFLAGS += -mfpu=vfp -mfloat-abi=hard

包括 $(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/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/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/xxx_jni/obj/local/armeabi-v7a/libxxx.so 使用 VFP 寄存器参数,输出不收集2 : ld 返回 1 个退出状态/arm-linux-androideabi/bin/ld:错误:/Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/libxxx.so 使用 VFP 寄存器参数,输出不收集 2:ld 返回 1退出状态/arm-linux-androideabi/bin/ld:错误:/Users/asmirnov/Documents/dev/src/xxx_jni/obj/local/armeabi-v7a/libxxx.so 使用 VFP 寄存器参数,输出不收集 2:ld 返回 1退出状态

4

2 回答 2

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
于 2014-08-02T21:15:39.727 回答
1

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

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

更多细节请看Getting hardware floating point with android NDK,fadden给出了一个很好很清晰的答案,这里不再赘述。

于 2013-11-27T09:06:35.103 回答