Program Tip

Android NDK 및 STLport에서 boost 라이브러리 (shared_ptr 포함)를 사용하는 방법

programtip 2020. 12. 27. 19:56
반응형

Android NDK 및 STLport에서 boost 라이브러리 (shared_ptr 포함)를 사용하는 방법


적어도 라이브러리를 깔끔하게 컴파일하는 한, 내가 알아 냈기 때문에 이것은 질문보다 답에 가깝습니다. 저에게 가장 큰 문제는 shared_ptr을 작동시키는 것이 었습니다.

성분 :

부스트 v. 1.45.0

http://www.anddev.org/viewtopic.php?p=29939 의 STLport 버전 .

NDK의 버전 r4b입니다.

지도:

Android.mk 파일에 다음을 추가하십시오.

LOCAL_CFLAGS += -DBOOST_EXCEPTION_DISABLE -D_STLP_NO_EXCEPTIONS -DOS_ANDROID -D_STLP_USE_SIMPLE_NODE_ALLOC

stlport / stl / _string.h의 613 행에서 __stl_throw_length_error에 대한 호출을 제거하십시오. 원하는 경우 _STLP_NO_EXCEPTIONS를 사용할 수 있습니다.

261 행 다음에 boost / boost / smart_ptr / shared_ptr.hpp를 편집하여 shared_ptr 생성자에서 boost :: throw_exception에 대한 호출을 제거합니다. 메서드의 전체 본문에 #ifndef BOOST_EXCEPTION_DISABLE을 사용했습니다. (그러나 아래 답변을 참조하십시오.)

다음으로 누락 된 부품을 제공해야합니다. 다음을 사용하여 헤더 파일을 만듭니다.

#ifdef OS_ANDROID

#include <exception>

namespace std
{
    struct bad_alloc : public exception { bad_alloc operator()(){}};
}

#endif

및 bad_alloc을 지원하기 위해 제거 된 예외 클래스가있는 소스 파일 :

#ifdef OS_ANDROID

#include <exception>

namespace std
{
    exception::exception() {}
    exception::~exception() {}
    const char* exception::what() const {}
}

#endif

boost / shared_ptr.hpp를 포함하는 모든 곳에 헤더를 포함합니다. 소스를 컴파일하고 라이브러리에 추가하십시오.


이 접근 방식은 디버깅 가능한 라이브러리를 컴파일 할 때 완전히 작동하지 않는 것으로 나타났습니다. 릴리스 라이브러리는 일부 문제를 최적화하는 -O2로 컴파일되지만 디버그 라이브러리는 몇 가지 추가 문제를 나타내는 -O0으로 수행됩니다. 또한 부스트 파일을 편집해야하는 것이 너무 만족스럽지 않았습니다. 그래서 추가 연구를 통해 다음과 같은 해결책을 찾았습니다.

첫째, 부스트 파일을 편집하지 마십시오. 대신 std 네임 스페이스 내의 헤더에 다음을 추가하십시오.

struct bad_cast : public exception {bad_cast operator()(){}};

다음으로 소스 파일에 다음을 추가하십시오.

namespace boost
{
    void throw_exception(std::exception const&) {}
}

이제 AndroidManifest.xml의 android : debuggable = "true"를 사용해도 애플리케이션이 컴파일되고 링크됩니다. 에뮬레이터에서는 실행되지 않지만이 라이브러리를 포함하기 전에는 실행되지 않았습니다.


특히, NDK r5에는 STLport 및 GNU STL이 함께 제공되므로 a) STL 지원 b) NDK C ++ 컴파일러에서 예외 지원이 있으므로 여기에서 해킹이 더 이상 필요하지 않습니다.


특히 shared_ptr에 대한 또 다른 해결 방법은 boost :: intrusive_ptr을 대신 사용하는 것입니다. 이것은 항상 가능한 것은 아니지만 내 상황에 맞았습니다.


현재 Android NDK (r9) 버전은 이제 예외를 지원합니다.

다양한 런타임의 기능은 다양합니다. 이 표를 참조하십시오.

          C++       C++   Standard
          Exceptions  RTTI  Library
system    no           no        no
gabi++   yes          yes        no
stlport  yes          yes       yes
gnustl   yes          yes       yes

stlport는 비 GPL 바이너리에서 사용할 수 있습니다. 여전히 실험용으로 플래그가 지정되어 있지만 clang 및 gcc와 함께 사용할 수 있습니다.

See http://developer.android.com/tools/sdk/ndk/

ReferenceURL : https://stackoverflow.com/questions/4347151/how-to-use-the-boost-library-including-shared-ptr-with-the-android-ndk-and-stl

반응형