2017-04-17 1 views
1

여러 사용자 정의 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)는

  • NDK (도 23 시도) hard-float에서 softfp까지의 라이브러리; 일부는 무거운 매트릭스 처리에 초점을 맞추고 하드 플로트에 최적화되어 있습니다. 그리고 내가 이해하는 것으로부터 나는 softfp와 hard를 섞을 수 없다 ...

    hard-float 용 libC++을 다시 컴파일하는 것을 넘어서, 다른 옵션이 있습니까? 하드 플로트 ABI 지원이 R12에 NDK에서 제거

  • +1

    플로팅 값을 출력하는 데 사용하는 코드를 게시하십시오. 'libC++'라이브러리가 문제라면,'float' 값을 출력 할 수있는 문자열로 변환하는 방법이있을 수 있습니다. 아마도 C 스타일의'printf()'또는 유사하게 작동 할 것입니다. –

    +0

    감사합니다. libC++ 대신 libc로 연기하는 것과 동일한 문제 일 수 있다고 생각합니다. 또한, 문제가 발생할 수있는 libC++ 의존성이있는 타사 라이브러리에서 다른 장소 (일부는 제어 할 수 없음)가있을 수 있습니다. –

    +0

    @AndrewHenle 귀하의 제안이 (적어도 텍스트 및 플로트를 다루는 데있어) 효과가있었습니다. 다시 한 번 감사드립니다. 하드 플로트 플래그로 컴파일 된 libC++로 링크 된 다른 사람들의 경험이 아직도 궁금합니다. –

    답변

    1

    추가 예제 코드 : https://android.googlesource.com/platform/ndk/+/master/docs/HardFloatAbi.md

    편집 (I 잠시 다시 구글의 libC++ 라이브러리를 해당 있었음에 틀림 하드 ABI에 대한 지원을 중단 이해)

    libm_hard 사용을 중단하고 잘해야합니다 (이 문제는 r15에서 수정 된 사항입니다. 혼란스러워서 죄송합니다!).

    비 하드 플로트 ABI는 여전히 부동 소수점 명령어를 사용한다는 점에 유의해야합니다. 유일한 차이점은 ABI를 통과하는 함수 인수입니다.

    +0

    감사합니다. 그냥 내 제안을 이해할 수 있도록 : 나는 libm_hard와 연결해서는 안되며 또한 애플 리케이션을 컴파일 할 때 hard-float와 관련된 모든 컴파일러 플래그를 제거해야한다. 맞습니까? 그렇게 할 때 하드 플로트 지원으로 컴파일 된 제 3 자 라이브러리 중 하나를 사용하여 문제 (일부 double에 대한 NaN 값)를 실행하기 시작합니다. 왜 이런 일이 일어나는지 더 자세히 살펴볼 수는 있지만 내가 제안한 내용, 즉하드 플로트 플래그로 빌드 된 라이브러리와 링크 할 수 있어야합니까? –

    +1

    의존하는 하드 플로트 라이브러리는 그 함수가 하드 플로팅 호출 규칙을 사용한다면'__attribute __ ((pcs ("aapcs-vfp")))'라는 헤더에 주석을 달아야합니다. '-mfloat-abi = hard'와'-mhard-float' (중복, btw) 플래그 만 제거하면됩니다. –