备份一下手工书写Android JNI工程时mk的模板,以及uses VFP register arguments, output does not问题 - Go语言中文社区

备份一下手工书写Android JNI工程时mk的模板,以及uses VFP register arguments, output does not问题


Android JNI开发,手工建立MK模板:


Application.mk

APP_ABI := armeabi-v7a
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++11
APP_PLATFORM := android-15


Android.mk

LOCAL_PATH := $(call my-dir)

#print message
#$(warning "the value of LOCAL_PATH is $(LOCAL_PATH)")

include $(CLEAR_VARS)
LOCAL_MODULE  := native-lib
LOCAL_C_INCLUDES = $(LOCAL_PATH)/3rdparty/include
LOCAL_SRC_FILES  := native-lib.cpp #
					#3rdparty/src/aaidsys.c 
					#3rdparty/src/queue.c 
					#3rdparty/src/video.c 
					#3rdparty/src/ysqfd.c 
					#3rdparty/src/yuvproc.c
#LOCAL_CFLAGS := -mfloat-abi=hard -D_NDK_MATH_NO_SOFTFP=1
LOCAL_CPPFLAGS := -s -mfloat-abi=softfp -mfpu=neon -D_NDK_MATH_NO_SOFTFP=1
####include the 3rdparty(method1)####
#LOCAL_LDLIBS += -llog -L$(LOCAL_PATH)/3rdparty/lib/ -lysqfd32
####include the 3rdparty(method2)####
#LOCAL_SHARED_LIBRARIES := ysqfd32

include $(BUILD_SHARED_LIBRARY)


####the 3rdparty####
include $(CLEAR_VARS)
#$(warning "the value of LOCAL_PATH is $(LOCAL_PATH)") 
LOCAL_MODULE := ysqfd32
LOCAL_SRC_FILES  := 3rdparty/lib/libysqfd32.so
include $(PREBUILT_SHARED_LIBRARY)


本来想用一下,于仕琪博士的人脸检测库,无奈怎么也链接不上库~~~~

D:/Android/android-sdk-windows/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/binld: error: ../../../../src/main/jniLibs/armeabi-v7a/libysqfd32.so uses VFP register arguments, output does not


网搜所有的答案,都不能解决问题,只好求助NDK社区(https://github.com/android-ndk/ndk/),得到答复:

https://github.com/android-ndk/ndk/issues/552#event-1308445210

Like I said in the other bug, you don't. Android does not use the hard float calling convention. You do not need -mfloat-abi=hard to use floating point instructions. It only affects the calling convention.

就是根本不支持啊,开始的时候我也纳闷,怎么就没有一个宏能够改变默认的浮点数使用方式?

虽然得到google人员的肯定回复,但还是有个疑问:NDK编译工具下的hard是干什么用的?

toolchainsarm-linux-androideabi-4.9prebuiltwindows-x86_64libgccarm-linux-androideabi4.9.xarmv7-ahard*

这些库难道不是为了支持hard float?


还是另找出路:arm-linux-gnueabihf 貌似可以解决我的问题,待实践~~~~


找到原因了,Hard VFP是不支持NDK交叉编译工具的,只能使用板载系统工具本地编译,不过这样arm-linux-gnueabihf又有什么用呢???


其实是支持交叉编译的,使用 arm-linux-gnueabihf 编译后的程序里面有

Tag_ABI_VFP_args: VFP registers

普通的交叉编译工具是没有这个的!!!

How to Detect if an ARM ELF Binary is Hard-float (ARMHF) or Soft-float (ARMEL)

https://www.cnx-software.com/2013/04/22/how-to-detect-if-an-arm-elf-binary-is-hard-float-armhf-or-soft-float-armel/


以下是一个小程序:

@echo off


set PATH=F:gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_win32bin;D:Androidandroid-sdk-windowsplatform-tools;%PATH%


echo "mfloat compiling......"
arm-linux-gnueabihf-gcc.exe -v -static mfloat.c -o demo
rem arm-linux-gnueabihf-gcc.exe -v -ffast-math mfloat.c -o demo
pause


rem arm-linux-gnueabihf-readelf.exe -a demo
pause


rem arm-linux-gnueabihf-readelf.exe -a libysqfd32.so
pause


adb push demo /data/local/tmp/
adb shell chmod 777 /data/local/tmp/demo
adb shell ls -l /data/local/tmp/
adb shell /data/local/tmp/demo


pause

mfloat.c

#include <stdio.h>

int main(void)
{
	double a,b,c;
	a = 23.543;
	b = 323.234;
	c = b/a;
	printf("the 13/2 = %fn", c);
	printf("hello world !n");
	return 0;
}




版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/houwenbin1986/article/details/78336989
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2021-05-15 19:57:56
  • 阅读 ( 1024 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢