여러 사용자 정의 C++ 라이브러리를 사용하는 작은 Java 프로그램을 컴파일 할 때 문제가 있습니다. 모든 라이브러리는 armeabi-v7a를 대상으로하며 하드 플로트 지원으로 컴파일됩니다 (mfloat-abi = hard -mfpu = neon -mhard-float -D_NDK_MATH_NO_SOFTFP = 1). 나는 Java/Android 프로젝트의 일부인 다른 cpp 파일 몇 개를 가지고있다. (libm.a 대신) libm_hard.a에 링크합니다.Android NDK : 하드 플로트 용 libC++ 지원
프로그램을 실행할 때 cpp 파일 (사용자 정의 라이브러리가 아님)과 유사한 이상한 동작이 일어나고 있습니다 arm cortex a9 cross compiling strange floating point behaviour. 적법한 부동 소수점 값 (코드에서 디버거를 통해 검사 됨)은 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를 통해 그것들을 검사했는데, 그들은 hard-float (VPF 레지스터에 대한 언급 없음)을 위해 컴파일되지 않은 것으로 보인다. NDK에서 하드 플로트 용으로 컴파일 된 libC++ (정적 또는 공유) 버전을 찾을 수 없었습니다.
- 안드로이드 SDK : 14.1.3816874
- 안드로이드 스튜디오 : 2.3.1는
내가 (쉽게) 상류를 변경할 수 없습니다 (21)는
hard-float 용 libC++을 다시 컴파일하는 것을 넘어서, 다른 옵션이 있습니까? 하드 플로트 ABI 지원이 R12에 NDK에서 제거
플로팅 값을 출력하는 데 사용하는 코드를 게시하십시오. 'libC++'라이브러리가 문제라면,'float' 값을 출력 할 수있는 문자열로 변환하는 방법이있을 수 있습니다. 아마도 C 스타일의'printf()'또는 유사하게 작동 할 것입니다. –
감사합니다. libC++ 대신 libc로 연기하는 것과 동일한 문제 일 수 있다고 생각합니다. 또한, 문제가 발생할 수있는 libC++ 의존성이있는 타사 라이브러리에서 다른 장소 (일부는 제어 할 수 없음)가있을 수 있습니다. –
@AndrewHenle 귀하의 제안이 (적어도 텍스트 및 플로트를 다루는 데있어) 효과가있었습니다. 다시 한 번 감사드립니다. 하드 플로트 플래그로 컴파일 된 libC++로 링크 된 다른 사람들의 경험이 아직도 궁금합니다. –