diff options
author | Tor Lillqvist <tlillqvist@suse.com> | 2011-11-24 19:02:17 +0200 |
---|---|---|
committer | Tor Lillqvist <tlillqvist@suse.com> | 2011-11-24 19:20:15 +0200 |
commit | c366d95851fe00c6cfd4d0efd6628cab42eb6ff9 (patch) | |
tree | 12644cbb830f0b0d03d6c10db3ee4872e44a01bb /bridges/source | |
parent | 5df86787093a8c9c73557fb8d01581a15bad5d86 (diff) |
Use RTLD_DEFAULT on Android
dlopen()ing NULL (the main program) and dlsym()ing on that handle does
not work on Android as in GNU/Linux. So don't bother with that, just
call dlsym(RTLD_DEFAULT, symbol) instead.
But, it doesn't help, it won't find the type_infos anyway, as they are
weak symbols and the dlsym() at least in Android 4.0 does not like
weak symbols, "Symbol is not global."
So the fallback branch that dynamically generates a type_info, which
normally should get used only for inter-process UNO (and thus
presumably never on Android) is taken instead.
But, that didn't work either at least with NDK r7 thanks to a bug in
its libgnustl_shared.so. But we now patch that at run-time in
android_main() in sal/osl/android/jni/lo-bootstrap.c.
Are we having fun yet?
Diffstat (limited to 'bridges/source')
-rw-r--r-- | bridges/source/cpp_uno/gcc3_linux_arm/except.cxx | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx b/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx index 7833ca33c363..cbf33534541d 100644 --- a/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx +++ b/bridges/source/cpp_uno/gcc3_linux_arm/except.cxx @@ -108,7 +108,9 @@ namespace CPPU_CURRENT_NAMESPACE t_rtti_map m_rttis; t_rtti_map m_generatedRttis; +#ifndef ANDROID void * m_hApp; +#endif public: RTTI() SAL_THROW( () ); @@ -118,13 +120,17 @@ namespace CPPU_CURRENT_NAMESPACE }; //____________________________________________________________________ RTTI::RTTI() SAL_THROW( () ) +#ifndef ANDROID : m_hApp( dlopen( 0, RTLD_LAZY ) ) +#endif { } //____________________________________________________________________ RTTI::~RTTI() SAL_THROW( () ) { +#ifndef ANDROID dlclose( m_hApp ); +#endif } //____________________________________________________________________ @@ -153,7 +159,14 @@ namespace CPPU_CURRENT_NAMESPACE buf.append( 'E' ); OString symName( buf.makeStringAndClear() ); +#ifndef ANDROID rtti = (type_info *)dlsym( m_hApp, symName.getStr() ); +#else + rtti = (type_info *)dlsym( RTLD_DEFAULT, symName.getStr() ); + // Unfortunately dlsym for weak symbols doesn't work in + // Android 4.0 at least, sigh, so we will always take the + // else branch below. +#endif if (rtti) { @@ -165,11 +178,22 @@ namespace CPPU_CURRENT_NAMESPACE { // try to lookup the symbol in the generated rtti map t_rtti_map::const_iterator iFind2( m_generatedRttis.find( unoName ) ); + if (iFind2 == m_generatedRttis.end()) { // we must generate it ! // symbol and rtti-name is nearly identical, // the symbol is prefixed with _ZTI + +#ifdef ANDROID + // This code is supposed to be used only used for + // inter-process UNO, says sberg. Thus it should + // be unnecessary and never reached for + // Android. But see above... + + // OSL_ASSERT (iFind2 != m_generatedRttis.end()); + // return NULL; +#endif char const * rttiName = symName.getStr() +4; #if OSL_DEBUG_LEVEL > 1 fprintf( stderr,"generated rtti for %s\n", rttiName ); |