编译使用多个定制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++库支持)
编辑:添加示例代码
发布您用来输出浮点值的代码。如果是'libC++'库就是问题所在,可能有办法将'float'值转换为可以输出的字符串。也许C风格的'printf()'或类似的工作。 –
谢谢,我会尝试,但我认为这可能是相同的问题,只是推迟到libc而不是libC++。另外,可能会有其他地方(我无法控制的地方)在第三方库中导致问题发生的libC++依赖关系。 –
@AndrewHenle你的建议工作(至少处理文本io和浮动),再次感谢。我仍然很好奇其他人与使用硬浮标志编译的libC++链接的经验。 –