Android NDK:LIBC 支持硬质量

Android NDK: libc++ support for hard-float

本文关键字:支持 LIBC NDK Android      更新时间:2023-10-16

我在编译使用多个自定义C 库的小Java程序时遇到了问题。所有图书馆都针对Armeabi-V7a,并用硬质支持(mfloat-abi = Hard(编译-mfpu = neon -mhard -float -d_ndk_math_no_softfp = 1(。我还有其他几个CPP文件是Java/Android项目的一部分;这些也通过上述设置进行了编译,我链接到libm_hard.a(而不是libm.a(

运行程序时,我会从CPP文件(不是自定义库(中获得奇怪的行为,类似于ARM Cortex A9交叉编译奇怪的浮点行为。合法的浮点值(在代码中,通过调试器检查(在stdout或fstream上打印为极小的值(例如1.47895e-309(。

  std::ofstream os;
  os.open(filename, std::ios::out);
  double x = 0.34343;
  double y = log(0.1);
  os << x << "t" << y << endl;
  os.close();

似乎发生了这种情况,因为Libc 库未针对硬质量汇编;我尝试了libc 的静态和共享版本,并且得到了相同的行为。我还通过Readelf对它们进行了检查,看来它们没有用于硬质量流动(没有提及VPF寄存器(。我找不到libc 的版本(静态或共享(,该版本是在NDK中编译的。

  • Android SDK:21(也用23次尝试(
  • NDK:14.1.3816874
  • Android Studio:2.3.1

我无法(轻松地(将上游库从硬浮动库更改为softfp;有些专注于重型矩阵处理,并针对硬质量浮动进行了优化。而且,据我了解,我不能混合软fp和硬质量...

除了重新编译libc 以进行硬流畅,我还有其他选择吗?(我了解前一段时间Google放弃了对Hard Abi的支持,这一定有相应的LIBC 库(

编辑:添加了示例代码

r12中的ndk删除了硬浮动abi支撑>

停止使用libm_hard,您应该没问题(不要删除这是R15中修复的监督,对此感到抱歉!(。

非常重要的是要注意,非固定的ABI仍然使用浮点说明。唯一的区别是函数参数通过ABI。