diff options
Diffstat (limited to 'bridges')
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_intel/except.cxx | 18 | ||||
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_intel/share.hxx | 27 |
2 files changed, 37 insertions, 8 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx b/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx index 1438312d90ff..3a8e5753b053 100644 --- a/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx +++ b/bridges/source/cpp_uno/gcc3_linux_intel/except.cxx @@ -90,7 +90,9 @@ class RTTI t_rtti_map m_rttis; t_rtti_map m_generatedRttis; +#if defined ANDROID void * m_hApp; +#endif public: RTTI(); @@ -100,13 +102,17 @@ public: }; RTTI::RTTI() +#if !defined ANDROID : m_hApp( dlopen(nullptr, RTLD_LAZY) ) +#endif { } RTTI::~RTTI() { +#if !defined ANDROID dlclose( m_hApp ); +#endif } @@ -135,7 +141,11 @@ type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) buf.append( 'E' ); OString symName( buf.makeStringAndClear() ); +#if !defined ANDROID rtti = static_cast<type_info *>(dlsym( m_hApp, symName.getStr() )); +#else + rtti = static_cast<type_info *>(dlsym( RTLD_DEFAULT, symName.getStr() )); +#endif if (rtti) { @@ -156,9 +166,6 @@ type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) #if OSL_DEBUG_LEVEL > 1 fprintf( stderr,"generated rtti for %s\n", rttiName ); #endif -// TODO: incompatible with llvm-c++ in ndk16 - no __si_class_type_info or __class_type_info -// either do as iOS one and inline thing or find another way -#if !defined(ANDROID) if (pTypeDescr->pBaseTypeDescription) { // ensure availability of base @@ -176,9 +183,6 @@ type_info * RTTI::getRTTI( typelib_CompoundTypeDescription *pTypeDescr ) pair< t_rtti_map::iterator, bool > insertion( m_generatedRttis.insert( t_rtti_map::value_type( unoName, rtti ) ) ); SAL_WARN_IF( !insertion.second, "bridges", "### inserting new generated rtti failed?!" ); -#else - (void) rttiName; // silence -Wunused-variable -#endif } else // taking already generated rtti { @@ -244,9 +248,7 @@ void raiseException( uno_Any * pUnoExc, uno_Mapping * pUno2Cpp ) static RTTI rtti_data; rtti = rtti_data.getRTTI(reinterpret_cast<typelib_CompoundTypeDescription*>(pTypeDescr)); TYPELIB_DANGER_RELEASE( pTypeDescr ); -#if !defined(ANDROID) // see TODO above assert(rtti && "### no rtti for throwing exception!"); -#endif if (! rtti) { throw RuntimeException( diff --git a/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx b/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx index fb8f25353918..39325c84e7ea 100644 --- a/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx +++ b/bridges/source/cpp_uno/gcc3_linux_intel/share.hxx @@ -33,6 +33,33 @@ #include <uno/any2.h> #include <uno/mapping.h> +#if !HAVE_CXXABI_H_CLASS_TYPE_INFO +// <https://mentorembedded.github.io/cxx-abi/abi.html>, +// libstdc++-v3/libsupc++/cxxabi.h: +namespace __cxxabiv1 { +class __class_type_info: public std::type_info { +public: + explicit __class_type_info(char const * n): type_info(n) {} + ~__class_type_info() override; +}; +} +#endif + +#if !HAVE_CXXABI_H_SI_CLASS_TYPE_INFO +// <https://mentorembedded.github.io/cxx-abi/abi.html>, +// libstdc++-v3/libsupc++/cxxabi.h: +namespace __cxxabiv1 { +class __si_class_type_info: public __class_type_info { +public: + __class_type_info const * __base_type; + explicit __si_class_type_info( + char const * n, __class_type_info const *base): + __class_type_info(n), __base_type(base) {} + ~__si_class_type_info() override; +}; +} +#endif + namespace CPPU_CURRENT_NAMESPACE { |