Android NDK:libc ++支持hard-float

时间:2017-04-17 05:16:51

标签: android c++ android-ndk java-native-interface

编译使用多个自定义c ++库的小型Java程序时,我遇到了问题。所有的库都针对armeabi-v7a,并使用hard-float支持编译(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 cross compiling strange floating point behaviour类似。合法浮点值(在代码中,通过调试器检查)作为极小值(例如1.47895e-309)打印在stdout或fstream上。

  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 ++库没有为hard-float编译;我尝试了libc ++的静态和共享版本,并且我得到了相同的行为。我还通过readelf检查了它们,似乎它们没有编译为hard-float(没有提到VPF寄存器)。我无法找到在NDK中为hard-float编译的libc ++版本(静态或共享)。

  • Android SDK:21(也尝试过23)
  • NDK:14.1.3816874
  • Android Studio:2.3.1

我无法(轻松地)将上游库从hard-float更改为softfp;一些专注于重基质处理并针对硬浮法进行了优化。而且,根据我的理解,我不能混合softfp和硬...

除了重新编译libc ++ for hard-float之外,我还有其他选择吗? (我理解一段时间后谷歌放弃了对硬abi的支持,这必须有相应的libc ++库)

编辑:添加了示例代码

1 个答案:

答案 0 :(得分:1)

在r12:https://android.googlesource.com/platform/ndk/+/master/docs/HardFloatAbi.md

中从NDK中删除了硬浮动ABI支持

停止使用libm_hard,你应该没事(不是删除这是在r15中修复的疏忽,抱歉混淆!)。

非常重要的是要注意非硬浮点ABI仍然使用浮点指令。唯一的区别是传递ABI的函数参数。