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

标签 android linker android-ndk ld

我已经使用“-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/

相关文章:

android - 关闭滑动菜单

c++ - 如何使用 Cygwin 打开 RTTI?

android - 当传递给 JNI 层下的 C 函数时,指针的地址发生变化

android - 如何在 Android 4.4 的 onActivityResult 中获取文件路径

android - 在 Android 中解析 5MB JSON 响应时出现内存不足异常

C++ 结构的多重定义

iphone - 在 iPhone 上使用 boost 功能

android - Superpowered API - SuperpoweredDecoder::decode 不为文件末尾返回 0

javascript - 在 Android 浏览器上缩放 iframe

c++ - 预先估计输出的 dll/exe 的大小?