Any JNI/UNO bridge experts around? Some assumptions about field ids are apparently not valid for Dalvik

Tor Lillqvist tml at iki.fi
Mon Mar 26 03:21:57 PDT 2012


The following patch seems to help, does it look sane?

--tml

diff --git a/bridges/source/jni_uno/jni_data.cxx
b/bridges/source/jni_uno/jni_data.cxx
index 9d77812..cabca76 100644
--- a/bridges/source/jni_uno/jni_data.cxx
+++ b/bridges/source/jni_uno/jni_data.cxx
@@ -1968,7 +1968,26 @@ void Bridge::map_to_java(
                         comp_td)->pParameterizedTypes != 0;
                 for ( sal_Int32 nPos = comp_td->nMembers; nPos--; )
                 {
-                    jfieldID field_id = linfo->m_fields[ nPos ];
+                    jfieldID field_id;
+
+                    // Handle com.sun.star.uno.RuntimeException::Context as a
+                    // special case. In (C++) UNO css::uno::RuntimeException
+                    // is simply a subclass of css::uno::Exception, which
+                    // contains the Context field. In the Java UNO mapping
+                    // css.uno.RuntimeException is a subclass of
+                    // java.lang.RuntimeException, and has a Context field of
+                    // its own, separate from that of css.uno.Exception.
+
+                    // In Dalvik the field IDs of these Context fields
+                    // differ. (In Java VMs they seem to be the same.)
+
+                    if (type_equals( comp_info->m_td.get()->pWeakRef,
+
m_jni_info->m_RuntimeException_type.getTypeLibType() )
+                        && nPos == 1)
+                        field_id =
m_jni_info->m_field_css_uno_RuntimeException_m_Context;
+                    else
+                        field_id = linfo->m_fields[ nPos ];
+
                     if (0 != field_id)
                     {
                         void const * p =
diff --git a/bridges/source/jni_uno/jni_info.cxx
b/bridges/source/jni_uno/jni_info.cxx
index a5ed28a..1d601cf 100644
--- a/bridges/source/jni_uno/jni_info.cxx
+++ b/bridges/source/jni_uno/jni_info.cxx
@@ -762,6 +762,11 @@ JNI_info::JNI_info(
     jni.ensure_no_exception();
     OSL_ASSERT( 0 != m_field_JNI_proxy_m_oid );

+    m_field_css_uno_RuntimeException_m_Context = jni->GetFieldID(
+        (jclass) jo_RuntimeException.get(), "Context", "Ljava/lang/Object;" );
+    jni.ensure_no_exception();
+    OSL_ASSERT( 0 != m_field_css_uno_RuntimeException_m_Context );
+
     // get java env
     OUString java_env_type_name( RTL_CONSTASCII_USTRINGPARAM(UNO_LB_JAVA) );
     JLocalAutoRef jo_java(
diff --git a/bridges/source/jni_uno/jni_info.h
b/bridges/source/jni_uno/jni_info.h
index a356be2..9cdbbf4 100644
--- a/bridges/source/jni_uno/jni_info.h
+++ b/bridges/source/jni_uno/jni_info.h
@@ -204,6 +204,8 @@ public:
     jfieldID                    m_field_JNI_proxy_m_type;
     jfieldID                    m_field_JNI_proxy_m_oid;

+    jfieldID                    m_field_css_uno_RuntimeException_m_Context;
+
     //
     ::com::sun::star::uno::TypeDescription m_XInterface_queryInterface_td;
     ::com::sun::star::uno::Type const & m_Exception_type;


More information about the LibreOffice mailing list