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: */ |