| File: | bridges/source/jni_uno/jni_bridge.cxx |
| Location: | line 470, column 5 |
| Description: | Called C++ object pointer is null |
| 1 | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
| 2 | /************************************************************************* |
| 3 | * |
| 4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| 5 | * |
| 6 | * Copyright 2000, 2010 Oracle and/or its affiliates. |
| 7 | * |
| 8 | * OpenOffice.org - a multi-platform office productivity suite |
| 9 | * |
| 10 | * This file is part of OpenOffice.org. |
| 11 | * |
| 12 | * OpenOffice.org is free software: you can redistribute it and/or modify |
| 13 | * it under the terms of the GNU Lesser General Public License version 3 |
| 14 | * only, as published by the Free Software Foundation. |
| 15 | * |
| 16 | * OpenOffice.org is distributed in the hope that it will be useful, |
| 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 19 | * GNU Lesser General Public License version 3 for more details |
| 20 | * (a copy is included in the LICENSE file that accompanied this code). |
| 21 | * |
| 22 | * You should have received a copy of the GNU Lesser General Public License |
| 23 | * version 3 along with OpenOffice.org. If not, see |
| 24 | * <http://www.openoffice.org/license.html> |
| 25 | * for a copy of the LGPLv3 License. |
| 26 | * |
| 27 | ************************************************************************/ |
| 28 | |
| 29 | |
| 30 | #include "jni_bridge.h" |
| 31 | |
| 32 | #include "jvmaccess/unovirtualmachine.hxx" |
| 33 | #include "rtl/ref.hxx" |
| 34 | #include "rtl/unload.h" |
| 35 | #include "rtl/strbuf.hxx" |
| 36 | #include "uno/lbnames.h" |
| 37 | |
| 38 | |
| 39 | using namespace ::std; |
| 40 | using namespace ::rtl; |
| 41 | using namespace ::osl; |
| 42 | using namespace ::jni_uno; |
| 43 | |
| 44 | namespace |
| 45 | { |
| 46 | extern "C" |
| 47 | { |
| 48 | |
| 49 | //------------------------------------------------------------------------------ |
| 50 | void SAL_CALL Mapping_acquire( uno_Mapping * mapping ) |
| 51 | SAL_THROW_EXTERN_C()throw () |
| 52 | { |
| 53 | Mapping const * that = static_cast< Mapping const * >( mapping ); |
| 54 | that->m_bridge->acquire(); |
| 55 | } |
| 56 | |
| 57 | //------------------------------------------------------------------------------ |
| 58 | void SAL_CALL Mapping_release( uno_Mapping * mapping ) |
| 59 | SAL_THROW_EXTERN_C()throw () |
| 60 | { |
| 61 | Mapping const * that = static_cast< Mapping const * >( mapping ); |
| 62 | that->m_bridge->release(); |
| 63 | } |
| 64 | |
| 65 | //------------------------------------------------------------------------------ |
| 66 | void SAL_CALL Mapping_map_to_uno( |
| 67 | uno_Mapping * mapping, void ** ppOut, |
| 68 | void * pIn, typelib_InterfaceTypeDescription * td ) |
| 69 | SAL_THROW_EXTERN_C()throw () |
| 70 | { |
| 71 | uno_Interface ** ppUnoI = (uno_Interface **)ppOut; |
| 72 | jobject javaI = (jobject) pIn; |
| 73 | |
| 74 | OSL_ASSERT( sizeof (void *) == sizeof (jobject) )do { if (true && (!(sizeof (void *) == sizeof (jobject )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "74" ": "), "OSL_ASSERT: %s", "sizeof (void *) == sizeof (jobject)" ); } } while (false); |
| 75 | OSL_ENSURE( ppUnoI && td, "### null ptr!" )do { if (true && (!(ppUnoI && td))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "75" ": "), "%s", "### null ptr!"); } } while (false); |
| 76 | |
| 77 | if (0 == javaI) |
| 78 | { |
| 79 | if (0 != *ppUnoI) |
| 80 | { |
| 81 | uno_Interface * p = *(uno_Interface **)ppUnoI; |
| 82 | (*p->release)( p ); |
| 83 | *ppUnoI = 0; |
| 84 | } |
| 85 | } |
| 86 | else |
| 87 | { |
| 88 | try |
| 89 | { |
| 90 | Bridge const * bridge = |
| 91 | static_cast< Mapping const * >( mapping )->m_bridge; |
| 92 | JNI_guarded_context jni( |
| 93 | bridge->m_jni_info, |
| 94 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( |
| 95 | bridge->m_java_env->pContext ) ); |
| 96 | |
| 97 | JNI_interface_type_info const * info = |
| 98 | static_cast< JNI_interface_type_info const * >( |
| 99 | bridge->m_jni_info->get_type_info( |
| 100 | jni, (typelib_TypeDescription *)td ) ); |
| 101 | uno_Interface * pUnoI = bridge->map_to_uno( jni, javaI, info ); |
| 102 | if (0 != *ppUnoI) |
| 103 | { |
| 104 | uno_Interface * p = *(uno_Interface **)ppUnoI; |
| 105 | (*p->release)( p ); |
| 106 | } |
| 107 | *ppUnoI = pUnoI; |
| 108 | } |
| 109 | catch (const BridgeRuntimeError & err) |
| 110 | { |
| 111 | #if OSL_DEBUG_LEVEL1 > 0 |
| 112 | OString cstr_msg( |
| 113 | OUStringToOString( |
| 114 | OUSTR("[jni_uno bridge error] ")::rtl::OUString( (&("[jni_uno bridge error] ")[0]), ((sal_Int32 )((sizeof ("[jni_uno bridge error] ") / sizeof (("[jni_uno bridge error] " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + err.m_message, |
| 115 | RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); |
| 116 | OSL_FAIL( cstr_msg.getStr() )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "116" ": "), "%s", cstr_msg.getStr()); } } while (false); |
| 117 | #else |
| 118 | (void) err; // unused |
| 119 | #endif |
| 120 | } |
| 121 | catch (const ::jvmaccess::VirtualMachine::AttachGuard::CreationException &) |
| 122 | { |
| 123 | OSL_FAIL(do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "125" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) |
| 124 | "[jni_uno bridge error] attaching current thread "do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "125" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) |
| 125 | "to java failed!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "125" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false); |
| 126 | } |
| 127 | } |
| 128 | } |
| 129 | |
| 130 | //------------------------------------------------------------------------------ |
| 131 | void SAL_CALL Mapping_map_to_java( |
| 132 | uno_Mapping * mapping, void ** ppOut, |
| 133 | void * pIn, typelib_InterfaceTypeDescription * td ) |
| 134 | SAL_THROW_EXTERN_C()throw () |
| 135 | { |
| 136 | jobject * ppJavaI = (jobject *) ppOut; |
| 137 | uno_Interface * pUnoI = (uno_Interface *)pIn; |
| 138 | |
| 139 | OSL_ASSERT( sizeof (void *) == sizeof (jobject) )do { if (true && (!(sizeof (void *) == sizeof (jobject )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "139" ": "), "OSL_ASSERT: %s", "sizeof (void *) == sizeof (jobject)" ); } } while (false); |
| 140 | OSL_ENSURE( ppJavaI && td, "### null ptr!" )do { if (true && (!(ppJavaI && td))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "140" ": "), "%s", "### null ptr!"); } } while (false); |
| 141 | |
| 142 | try |
| 143 | { |
| 144 | if (0 == pUnoI) |
| 145 | { |
| 146 | if (0 != *ppJavaI) |
| 147 | { |
| 148 | Bridge const * bridge = |
| 149 | static_cast< Mapping const * >( mapping )->m_bridge; |
| 150 | JNI_guarded_context jni( |
| 151 | bridge->m_jni_info, |
| 152 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( |
| 153 | bridge->m_java_env->pContext ) ); |
| 154 | jni->DeleteGlobalRef( *ppJavaI ); |
| 155 | *ppJavaI = 0; |
| 156 | } |
| 157 | } |
| 158 | else |
| 159 | { |
| 160 | Bridge const * bridge = |
| 161 | static_cast< Mapping const * >( mapping )->m_bridge; |
| 162 | JNI_guarded_context jni( |
| 163 | bridge->m_jni_info, |
| 164 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( |
| 165 | bridge->m_java_env->pContext ) ); |
| 166 | |
| 167 | JNI_interface_type_info const * info = |
| 168 | static_cast< JNI_interface_type_info const * >( |
| 169 | bridge->m_jni_info->get_type_info( |
| 170 | jni, (typelib_TypeDescription *)td ) ); |
| 171 | jobject jlocal = bridge->map_to_java( jni, pUnoI, info ); |
| 172 | if (0 != *ppJavaI) |
| 173 | jni->DeleteGlobalRef( *ppJavaI ); |
| 174 | *ppJavaI = jni->NewGlobalRef( jlocal ); |
| 175 | jni->DeleteLocalRef( jlocal ); |
| 176 | } |
| 177 | } |
| 178 | catch (const BridgeRuntimeError & err) |
| 179 | { |
| 180 | #if OSL_DEBUG_LEVEL1 > 0 |
| 181 | OString cstr_msg( |
| 182 | OUStringToOString( |
| 183 | OUSTR("[jni_uno bridge error] ")::rtl::OUString( (&("[jni_uno bridge error] ")[0]), ((sal_Int32 )((sizeof ("[jni_uno bridge error] ") / sizeof (("[jni_uno bridge error] " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + err.m_message, |
| 184 | RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); |
| 185 | OSL_FAIL( cstr_msg.getStr() )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "185" ": "), "%s", cstr_msg.getStr()); } } while (false); |
| 186 | #else |
| 187 | (void) err; // unused |
| 188 | #endif |
| 189 | } |
| 190 | catch (const ::jvmaccess::VirtualMachine::AttachGuard::CreationException &) |
| 191 | { |
| 192 | OSL_FAIL(do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "193" ": "), "%s", "[jni_uno bridge error] attaching current thread to java failed!" ); } } while (false) |
| 193 | "[jni_uno bridge error] attaching current thread to java failed!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "193" ": "), "%s", "[jni_uno bridge error] attaching current thread to java failed!" ); } } while (false); |
| 194 | } |
| 195 | } |
| 196 | |
| 197 | //______________________________________________________________________________ |
| 198 | void SAL_CALL Bridge_free( uno_Mapping * mapping ) |
| 199 | SAL_THROW_EXTERN_C()throw () |
| 200 | { |
| 201 | Mapping * that = static_cast< Mapping * >( mapping ); |
| 202 | delete that->m_bridge; |
| 203 | } |
| 204 | |
| 205 | } |
| 206 | |
| 207 | rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT{ {rtl_moduleCount_acquire,rtl_moduleCount_release}, rtl_moduleCount_canUnload , 0, {0, 0}}; |
| 208 | |
| 209 | } |
| 210 | |
| 211 | namespace jni_uno |
| 212 | { |
| 213 | |
| 214 | //______________________________________________________________________________ |
| 215 | void Bridge::acquire() const SAL_THROW(()) |
| 216 | { |
| 217 | if (1 == osl_incrementInterlockedCount( &m_ref )) |
| 218 | { |
| 219 | if (m_registered_java2uno) |
| 220 | { |
| 221 | uno_Mapping * mapping = const_cast< Mapping * >( &m_java2uno ); |
| 222 | uno_registerMapping( |
| 223 | &mapping, Bridge_free, |
| 224 | m_java_env, (uno_Environment *)m_uno_env, 0 ); |
| 225 | } |
| 226 | else |
| 227 | { |
| 228 | uno_Mapping * mapping = const_cast< Mapping * >( &m_uno2java ); |
| 229 | uno_registerMapping( |
| 230 | &mapping, Bridge_free, |
| 231 | (uno_Environment *)m_uno_env, m_java_env, 0 ); |
| 232 | } |
| 233 | } |
| 234 | } |
| 235 | |
| 236 | //______________________________________________________________________________ |
| 237 | void Bridge::release() const SAL_THROW(()) |
| 238 | { |
| 239 | if (! osl_decrementInterlockedCount( &m_ref )) |
| 240 | { |
| 241 | uno_revokeMapping( |
| 242 | m_registered_java2uno |
| 243 | ? const_cast< Mapping * >( &m_java2uno ) |
| 244 | : const_cast< Mapping * >( &m_uno2java ) ); |
| 245 | } |
| 246 | } |
| 247 | |
| 248 | //______________________________________________________________________________ |
| 249 | Bridge::Bridge( |
| 250 | uno_Environment * java_env, uno_ExtEnvironment * uno_env, |
| 251 | bool registered_java2uno ) |
| 252 | : m_ref( 1 ), |
| 253 | m_uno_env( uno_env ), |
| 254 | m_java_env( java_env ), |
| 255 | m_registered_java2uno( registered_java2uno ) |
| 256 | { |
| 257 | // bootstrapping bridge jni_info |
| 258 | m_jni_info = JNI_info::get_jni_info( |
| 259 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( |
| 260 | m_java_env->pContext ) ); |
| 261 | |
| 262 | OSL_ASSERT( 0 != m_java_env && 0 != m_uno_env )do { if (true && (!(0 != m_java_env && 0 != m_uno_env ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "262" ": "), "OSL_ASSERT: %s", "0 != m_java_env && 0 != m_uno_env" ); } } while (false); |
| 263 | (*((uno_Environment *)m_uno_env)->acquire)( (uno_Environment *)m_uno_env ); |
| 264 | (*m_java_env->acquire)( m_java_env ); |
| 265 | |
| 266 | // java2uno |
| 267 | m_java2uno.acquire = Mapping_acquire; |
| 268 | m_java2uno.release = Mapping_release; |
| 269 | m_java2uno.mapInterface = Mapping_map_to_uno; |
| 270 | m_java2uno.m_bridge = this; |
| 271 | // uno2java |
| 272 | m_uno2java.acquire = Mapping_acquire; |
| 273 | m_uno2java.release = Mapping_release; |
| 274 | m_uno2java.mapInterface = Mapping_map_to_java; |
| 275 | m_uno2java.m_bridge = this; |
| 276 | |
| 277 | (*g_moduleCount.modCnt.acquire)( &g_moduleCount.modCnt ); |
| 278 | } |
| 279 | |
| 280 | //______________________________________________________________________________ |
| 281 | Bridge::~Bridge() SAL_THROW(()) |
| 282 | { |
| 283 | (*m_java_env->release)( m_java_env ); |
| 284 | (*((uno_Environment *)m_uno_env)->release)( (uno_Environment *)m_uno_env ); |
| 285 | |
| 286 | (*g_moduleCount.modCnt.release)( &g_moduleCount.modCnt ); |
| 287 | } |
| 288 | |
| 289 | |
| 290 | //______________________________________________________________________________ |
| 291 | void JNI_context::java_exc_occurred() const |
| 292 | { |
| 293 | // !don't rely on JNI_info! |
| 294 | |
| 295 | JLocalAutoRef jo_exc( *this, m_env->ExceptionOccurred() ); |
| 296 | m_env->ExceptionClear(); |
| 297 | OSL_ASSERT( jo_exc.is() )do { if (true && (!(jo_exc.is()))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "297" ": "), "OSL_ASSERT: %s", "jo_exc.is()"); } } while (false); |
| 298 | if (! jo_exc.is()) |
| 299 | { |
| 300 | throw BridgeRuntimeError( |
| 301 | OUSTR("java exception occurred, but not available!?")::rtl::OUString( (&("java exception occurred, but not available!?" )[0]), ((sal_Int32)((sizeof ("java exception occurred, but not available!?" ) / sizeof (("java exception occurred, but not available!?")[ 0]))-1)), (((rtl_TextEncoding) 11)) ) + |
| 302 | get_stack_trace() ); |
| 303 | } |
| 304 | |
| 305 | // call toString(); don't rely on m_jni_info |
| 306 | jclass jo_class = m_env->FindClass( "java/lang/Object" ); |
| 307 | if (JNI_FALSE0 != m_env->ExceptionCheck()) |
| 308 | { |
| 309 | m_env->ExceptionClear(); |
| 310 | throw BridgeRuntimeError( |
| 311 | OUSTR("cannot get class java.lang.Object!")::rtl::OUString( (&("cannot get class java.lang.Object!") [0]), ((sal_Int32)((sizeof ("cannot get class java.lang.Object!" ) / sizeof (("cannot get class java.lang.Object!")[0]))-1)), ( ((rtl_TextEncoding) 11)) ) + get_stack_trace() ); |
| 312 | } |
| 313 | JLocalAutoRef jo_Object( *this, jo_class ); |
| 314 | // method Object.toString() |
| 315 | jmethodID method_Object_toString = m_env->GetMethodID( |
| 316 | (jclass) jo_Object.get(), "toString", "()Ljava/lang/String;" ); |
| 317 | if (JNI_FALSE0 != m_env->ExceptionCheck()) |
| 318 | { |
| 319 | m_env->ExceptionClear(); |
| 320 | throw BridgeRuntimeError( |
| 321 | OUSTR("cannot get method id of java.lang.Object.toString()!")::rtl::OUString( (&("cannot get method id of java.lang.Object.toString()!" )[0]), ((sal_Int32)((sizeof ("cannot get method id of java.lang.Object.toString()!" ) / sizeof (("cannot get method id of java.lang.Object.toString()!" )[0]))-1)), (((rtl_TextEncoding) 11)) ) + |
| 322 | get_stack_trace() ); |
| 323 | } |
| 324 | OSL_ASSERT( 0 != method_Object_toString )do { if (true && (!(0 != method_Object_toString))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "324" ": "), "OSL_ASSERT: %s", "0 != method_Object_toString" ); } } while (false); |
| 325 | |
| 326 | JLocalAutoRef jo_descr( |
| 327 | *this, m_env->CallObjectMethodA( |
| 328 | jo_exc.get(), method_Object_toString, 0 ) ); |
| 329 | if (m_env->ExceptionCheck()) // no chance at all |
| 330 | { |
| 331 | m_env->ExceptionClear(); |
| 332 | throw BridgeRuntimeError( |
| 333 | OUSTR("error examining java exception object!")::rtl::OUString( (&("error examining java exception object!" )[0]), ((sal_Int32)((sizeof ("error examining java exception object!" ) / sizeof (("error examining java exception object!")[0]))-1 )), (((rtl_TextEncoding) 11)) ) + |
| 334 | get_stack_trace() ); |
| 335 | } |
| 336 | |
| 337 | jsize len = m_env->GetStringLength( (jstring) jo_descr.get() ); |
| 338 | SAL_WNODEPRECATED_DECLARATIONS_PUSH |
| 339 | auto_ptr< rtl_mem > ustr_mem( |
| 340 | rtl_mem::allocate( |
| 341 | sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) ) ); |
| 342 | SAL_WNODEPRECATED_DECLARATIONS_POP |
| 343 | rtl_uString * ustr = (rtl_uString *)ustr_mem.get(); |
| 344 | m_env->GetStringRegion( (jstring) jo_descr.get(), 0, len, ustr->buffer ); |
| 345 | if (m_env->ExceptionCheck()) |
| 346 | { |
| 347 | m_env->ExceptionClear(); |
| 348 | throw BridgeRuntimeError( |
| 349 | OUSTR("invalid java string object!")::rtl::OUString( (&("invalid java string object!")[0]), ( (sal_Int32)((sizeof ("invalid java string object!") / sizeof ( ("invalid java string object!")[0]))-1)), (((rtl_TextEncoding ) 11)) ) + get_stack_trace() ); |
| 350 | } |
| 351 | ustr->refCount = 1; |
| 352 | ustr->length = len; |
| 353 | ustr->buffer[ len ] = '\0'; |
| 354 | OUString message( (rtl_uString *)ustr_mem.release(), SAL_NO_ACQUIRE ); |
| 355 | |
| 356 | throw BridgeRuntimeError( message + get_stack_trace( jo_exc.get() ) ); |
| 357 | } |
| 358 | |
| 359 | //______________________________________________________________________________ |
| 360 | void JNI_context::getClassForName( |
| 361 | jclass * classClass, jmethodID * methodForName) const |
| 362 | { |
| 363 | jclass c = m_env->FindClass("java/lang/Class"); |
| 364 | if (c != 0) { |
| 365 | *methodForName = m_env->GetStaticMethodID( |
| 366 | c, "forName", |
| 367 | "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;"); |
| 368 | } |
| 369 | *classClass = c; |
| 370 | } |
| 371 | |
| 372 | //______________________________________________________________________________ |
| 373 | jclass JNI_context::findClass( |
| 374 | char const * name, jclass classClass, jmethodID methodForName, |
| 375 | bool inException) const |
| 376 | { |
| 377 | jclass c = 0; |
| 378 | JLocalAutoRef s(*this, m_env->NewStringUTF(name)); |
| 379 | if (s.is()) { |
| 380 | jvalue a[3]; |
| 381 | a[0].l = s.get(); |
| 382 | a[1].z = JNI_FALSE0; |
| 383 | a[2].l = m_class_loader; |
| 384 | c = static_cast< jclass >( |
| 385 | m_env->CallStaticObjectMethodA(classClass, methodForName, a)); |
| 386 | } |
| 387 | if (!inException) { |
| 388 | ensure_no_exception(); |
| 389 | } |
| 390 | return c; |
| 391 | } |
| 392 | |
| 393 | //______________________________________________________________________________ |
| 394 | OUString JNI_context::get_stack_trace( jobject jo_exc ) const |
| 395 | { |
| 396 | JLocalAutoRef jo_JNI_proxy( |
| 397 | *this, |
| 398 | find_class( *this, "com.sun.star.bridges.jni_uno.JNI_proxy", true ) ); |
| 399 | if (assert_no_exception()) |
| 400 | { |
| 401 | // static method JNI_proxy.get_stack_trace() |
| 402 | jmethodID method = m_env->GetStaticMethodID( |
| 403 | (jclass) jo_JNI_proxy.get(), "get_stack_trace", |
| 404 | "(Ljava/lang/Throwable;)Ljava/lang/String;" ); |
| 405 | if (assert_no_exception() && (0 != method)) |
| 406 | { |
| 407 | jvalue arg; |
| 408 | arg.l = jo_exc; |
| 409 | JLocalAutoRef jo_stack_trace( |
| 410 | *this, m_env->CallStaticObjectMethodA( |
| 411 | (jclass) jo_JNI_proxy.get(), method, &arg ) ); |
| 412 | if (assert_no_exception()) |
| 413 | { |
| 414 | jsize len = |
| 415 | m_env->GetStringLength( (jstring) jo_stack_trace.get() ); |
| 416 | SAL_WNODEPRECATED_DECLARATIONS_PUSH |
| 417 | auto_ptr< rtl_mem > ustr_mem( |
| 418 | rtl_mem::allocate( |
| 419 | sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) ) ); |
| 420 | SAL_WNODEPRECATED_DECLARATIONS_POP |
| 421 | rtl_uString * ustr = (rtl_uString *)ustr_mem.get(); |
| 422 | m_env->GetStringRegion( |
| 423 | (jstring) jo_stack_trace.get(), 0, len, ustr->buffer ); |
| 424 | if (assert_no_exception()) |
| 425 | { |
| 426 | ustr->refCount = 1; |
| 427 | ustr->length = len; |
| 428 | ustr->buffer[ len ] = '\0'; |
| 429 | return OUString( |
| 430 | (rtl_uString *)ustr_mem.release(), SAL_NO_ACQUIRE ); |
| 431 | } |
| 432 | } |
| 433 | } |
| 434 | } |
| 435 | return OUString(); |
| 436 | } |
| 437 | |
| 438 | } |
| 439 | |
| 440 | using namespace ::jni_uno; |
| 441 | |
| 442 | extern "C" |
| 443 | { |
| 444 | namespace |
| 445 | { |
| 446 | |
| 447 | //------------------------------------------------------------------------------ |
| 448 | void SAL_CALL java_env_disposing( uno_Environment * java_env ) |
| 449 | SAL_THROW_EXTERN_C()throw () |
| 450 | { |
| 451 | ::jvmaccess::UnoVirtualMachine * machine = |
| 452 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( |
| 453 | java_env->pContext ); |
| 454 | java_env->pContext = 0; |
| 455 | machine->release(); |
| 456 | } |
| 457 | } |
| 458 | |
| 459 | //------------------------------------------------------------------------------ |
| 460 | void SAL_CALL uno_initEnvironment( uno_Environment * java_env ) |
| 461 | SAL_THROW_EXTERN_C()throw () |
| 462 | { |
| 463 | java_env->environmentDisposing = java_env_disposing; |
| 464 | java_env->pExtEnv = 0; // no extended support |
| 465 | OSL_ASSERT( 0 != java_env->pContext )do { if (true && (!(0 != java_env->pContext))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "465" ": "), "OSL_ASSERT: %s", "0 != java_env->pContext" ); } } while (false); |
| 466 | |
| 467 | ::jvmaccess::UnoVirtualMachine * machine = |
| 468 | reinterpret_cast< ::jvmaccess::UnoVirtualMachine * >( |
| 469 | java_env->pContext ); |
| 470 | machine->acquire(); |
Called C++ object pointer is null | |
| 471 | } |
| 472 | |
| 473 | //------------------------------------------------------------------------------ |
| 474 | void SAL_CALL uno_ext_getMapping( |
| 475 | uno_Mapping ** ppMapping, uno_Environment * pFrom, uno_Environment * pTo ) |
| 476 | SAL_THROW_EXTERN_C()throw () |
| 477 | { |
| 478 | OSL_ASSERT( 0 != ppMapping && 0 != pFrom && 0 != pTo )do { if (true && (!(0 != ppMapping && 0 != pFrom && 0 != pTo))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN ), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "478" ": "), "OSL_ASSERT: %s", "0 != ppMapping && 0 != pFrom && 0 != pTo" ); } } while (false); |
| 479 | if (0 != *ppMapping) |
| 480 | { |
| 481 | (*(*ppMapping)->release)( *ppMapping ); |
| 482 | *ppMapping = 0; |
| 483 | } |
| 484 | |
| 485 | OSL_ASSERT( JNI_FALSE == sal_False )do { if (true && (!(0 == ((sal_Bool)0)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "485" ": "), "OSL_ASSERT: %s", "JNI_FALSE == sal_False") ; } } while (false); |
| 486 | OSL_ASSERT( JNI_TRUE == sal_True )do { if (true && (!(1 == ((sal_Bool)1)))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "486" ": "), "OSL_ASSERT: %s", "JNI_TRUE == sal_True"); } } while (false); |
| 487 | OSL_ASSERT( sizeof (jboolean) == sizeof (sal_Bool) )do { if (true && (!(sizeof (jboolean) == sizeof (sal_Bool )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "487" ": "), "OSL_ASSERT: %s", "sizeof (jboolean) == sizeof (sal_Bool)" ); } } while (false); |
| 488 | OSL_ASSERT( sizeof (jchar) == sizeof (sal_Unicode) )do { if (true && (!(sizeof (jchar) == sizeof (sal_Unicode )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "488" ": "), "OSL_ASSERT: %s", "sizeof (jchar) == sizeof (sal_Unicode)" ); } } while (false); |
| 489 | OSL_ASSERT( sizeof (jdouble) == sizeof (double) )do { if (true && (!(sizeof (jdouble) == sizeof (double )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "489" ": "), "OSL_ASSERT: %s", "sizeof (jdouble) == sizeof (double)" ); } } while (false); |
| 490 | OSL_ASSERT( sizeof (jfloat) == sizeof (float) )do { if (true && (!(sizeof (jfloat) == sizeof (float) ))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "490" ": "), "OSL_ASSERT: %s", "sizeof (jfloat) == sizeof (float)" ); } } while (false); |
| 491 | OSL_ASSERT( sizeof (jbyte) == sizeof (sal_Int8) )do { if (true && (!(sizeof (jbyte) == sizeof (sal_Int8 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "491" ": "), "OSL_ASSERT: %s", "sizeof (jbyte) == sizeof (sal_Int8)" ); } } while (false); |
| 492 | OSL_ASSERT( sizeof (jshort) == sizeof (sal_Int16) )do { if (true && (!(sizeof (jshort) == sizeof (sal_Int16 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "492" ": "), "OSL_ASSERT: %s", "sizeof (jshort) == sizeof (sal_Int16)" ); } } while (false); |
| 493 | OSL_ASSERT( sizeof (jint) == sizeof (sal_Int32) )do { if (true && (!(sizeof (jint) == sizeof (sal_Int32 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "493" ": "), "OSL_ASSERT: %s", "sizeof (jint) == sizeof (sal_Int32)" ); } } while (false); |
| 494 | OSL_ASSERT( sizeof (jlong) == sizeof (sal_Int64) )do { if (true && (!(sizeof (jlong) == sizeof (sal_Int64 )))) { sal_detail_logFormat((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl" ), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "494" ": "), "OSL_ASSERT: %s", "sizeof (jlong) == sizeof (sal_Int64)" ); } } while (false); |
| 495 | if ((JNI_FALSE0 == sal_False((sal_Bool)0)) && |
| 496 | (JNI_TRUE1 == sal_True((sal_Bool)1)) && |
| 497 | (sizeof (jboolean) == sizeof (sal_Bool)) && |
| 498 | (sizeof (jchar) == sizeof (sal_Unicode)) && |
| 499 | (sizeof (jdouble) == sizeof (double)) && |
| 500 | (sizeof (jfloat) == sizeof (float)) && |
| 501 | (sizeof (jbyte) == sizeof (sal_Int8)) && |
| 502 | (sizeof (jshort) == sizeof (sal_Int16)) && |
| 503 | (sizeof (jint) == sizeof (sal_Int32)) && |
| 504 | (sizeof (jlong) == sizeof (sal_Int64))) |
| 505 | { |
| 506 | OUString const & from_env_typename = |
| 507 | OUString::unacquired( &pFrom->pTypeName ); |
| 508 | OUString const & to_env_typename = |
| 509 | OUString::unacquired( &pTo->pTypeName ); |
| 510 | |
| 511 | uno_Mapping * mapping = 0; |
| 512 | |
| 513 | try |
| 514 | { |
| 515 | if ( from_env_typename == UNO_LB_JAVA"java" && to_env_typename == UNO_LB_UNO"uno" ) |
| 516 | { |
| 517 | Bridge * bridge = |
| 518 | new Bridge( pFrom, pTo->pExtEnv, true ); // ref count = 1 |
| 519 | mapping = &bridge->m_java2uno; |
| 520 | uno_registerMapping( |
| 521 | &mapping, Bridge_free, |
| 522 | pFrom, (uno_Environment *)pTo->pExtEnv, 0 ); |
| 523 | } |
| 524 | else if ( from_env_typename == UNO_LB_UNO"uno" && to_env_typename == UNO_LB_JAVA"java" ) |
| 525 | { |
| 526 | Bridge * bridge = |
| 527 | new Bridge( pTo, pFrom->pExtEnv, false ); // ref count = 1 |
| 528 | mapping = &bridge->m_uno2java; |
| 529 | uno_registerMapping( |
| 530 | &mapping, Bridge_free, |
| 531 | (uno_Environment *)pFrom->pExtEnv, pTo, 0 ); |
| 532 | } |
| 533 | } |
| 534 | catch (const BridgeRuntimeError & err) |
| 535 | { |
| 536 | #if OSL_DEBUG_LEVEL1 > 0 |
| 537 | OString cstr_msg( |
| 538 | OUStringToOString( |
| 539 | OUSTR("[jni_uno bridge error] ")::rtl::OUString( (&("[jni_uno bridge error] ")[0]), ((sal_Int32 )((sizeof ("[jni_uno bridge error] ") / sizeof (("[jni_uno bridge error] " )[0]))-1)), (((rtl_TextEncoding) 11)) ) + err.m_message, |
| 540 | RTL_TEXTENCODING_ASCII_US(((rtl_TextEncoding) 11)) ) ); |
| 541 | OSL_FAIL( cstr_msg.getStr() )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "541" ": "), "%s", cstr_msg.getStr()); } } while (false); |
| 542 | #else |
| 543 | (void) err; // unused |
| 544 | #endif |
| 545 | } |
| 546 | catch (const ::jvmaccess::VirtualMachine::AttachGuard::CreationException &) |
| 547 | { |
| 548 | OSL_FAIL(do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "550" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) |
| 549 | "[jni_uno bridge error] attaching current thread "do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "550" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false) |
| 550 | "to java failed!" )do { if (true && (((sal_Bool)1))) { sal_detail_logFormat ((SAL_DETAIL_LOG_LEVEL_WARN), ("legacy.osl"), ("/usr/local/src/libreoffice/bridges/source/jni_uno/jni_bridge.cxx" ":" "550" ": "), "%s", "[jni_uno bridge error] attaching current thread " "to java failed!"); } } while (false); |
| 551 | } |
| 552 | |
| 553 | *ppMapping = mapping; |
| 554 | } |
| 555 | } |
| 556 | |
| 557 | //------------------------------------------------------------------------------ |
| 558 | SAL_DLLPUBLIC_EXPORT__attribute__ ((visibility("default"))) sal_Bool SAL_CALL component_canUnload( TimeValue * pTime ) |
| 559 | SAL_THROW_EXTERN_C()throw () |
| 560 | { |
| 561 | return (*g_moduleCount.canUnload)( &g_moduleCount, pTime ); |
| 562 | } |
| 563 | } |
| 564 | |
| 565 | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |