2017-04-17 42 views
1

编译使用多个定制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)Android NDK:libC++支持硬浮点数

当我运行该程序,我得到奇怪的行为从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++库没有编译为硬浮点;我尝试了libC++的静态和共享版本,并获得相同的行为。我也通过readelf检查过它们,看起来它们没有被编译为硬浮点(没有提到VPF寄存器)。我无法找到为NDK中的hard-float编译的libC++(静态或共享)版本。

  • Android SDK中:21(试图与23以及)
  • NDK:14.1.3816874
  • Android Studio中:2.3.1

我不能(容易地)改变上游从hard-float到softfp的库;有些专注于重载矩阵处理,并针对硬浮点进行了优化。而且,据我所知,我不能混用softfp和hard ...

除了重新编译libC++ for hard-float之外,还有其他选项吗? (我的理解前阵子谷歌下跌了硬ABI,必须有相应的libC++库支持)

编辑:添加示例代码

+1

发布您用来输出浮点值的代码。如果是'libC++'库就是问题所在,可能有办法将'float'值转换为可以输出的字符串。也许C风格的'printf()'或类似的工作。 –

+0

谢谢,我会尝试,但我认为这可能是相同的问题,只是推迟到libc而不是libC++。另外,可能会有其他地方(我无法控制的地方)在第三方库中导致问题发生的libC++依赖关系。 –

+0

@AndrewHenle你的建议工作(至少处理文本io和浮动),再次感谢。我仍然很好奇其他人与使用硬浮标志编译的libC++链接的经验。 –

回答

1

从NDK在R12去除硬浮动ABI支持:https://android.googlesource.com/platform/ndk/+/master/docs/HardFloatAbi.md

停止使用libm_hard,你应该没问题(没有删除这是一个在r15中修复的疏忽,对于混淆抱歉!)。

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

+0

谢谢。只是为了确保我理解你的建议:我不应该链接libm_hard,并且还应该在编译我的应用程序时删除所有与hard-float相关的编译器标志,是否正确?当我这样做时,我开始遇到问题(一些双打的NaN值)与第三方库,其中一个硬编译支持编译。我可以尝试更多地了解为什么会发生这种情况,但要确保我了解您的建议,即我应该仍然能够链接与硬浮标志建立的库? –

+1

你取决于应标注与'__attribute __头硬浮动库((PCS(“AAPCS-VFP”)))',如果它们的功能使用硬浮调用约定。你不需要删除'-mfpu = neon'标志,只需要'-mfloat-abi = hard'和'-mhard-float'(这是冗余的,顺便说一下)。 –