summaryrefslogtreecommitdiffstats
path: root/javaunohelper/source/bootstrap.cxx
diff options
context:
space:
mode:
authorDaniel Boelzle <dbo@openoffice.org>2002-11-14 14:29:55 +0000
committerDaniel Boelzle <dbo@openoffice.org>2002-11-14 14:29:55 +0000
commitc6c8cb2b7efdaf3a390615c57501b71f2e666c7c (patch)
treeb4deff3aaa9df9169c17bdfbad7e77f6c9e231d1 /javaunohelper/source/bootstrap.cxx
parent#97622# comment mark DST_OFFSET as Get only (diff)
downloadcore-c6c8cb2b7efdaf3a390615c57501b71f2e666c7c.tar.gz
core-c6c8cb2b7efdaf3a390615c57501b71f2e666c7c.zip
#103453# fixed bootstrapping from java
Diffstat (limited to 'javaunohelper/source/bootstrap.cxx')
-rw-r--r--javaunohelper/source/bootstrap.cxx109
1 files changed, 47 insertions, 62 deletions
diff --git a/javaunohelper/source/bootstrap.cxx b/javaunohelper/source/bootstrap.cxx
index 32f6fa1edd66..ed4bf7e556e6 100644
--- a/javaunohelper/source/bootstrap.cxx
+++ b/javaunohelper/source/bootstrap.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: bootstrap.cxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: obo $ $Date: 2002-11-05 09:31:35 $
+ * last change: $Author: dbo $ $Date: 2002-11-14 15:29:55 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -64,39 +64,47 @@
#include <rtl/bootstrap.hxx>
#include <rtl/string.hxx>
-#include <uno/environment.hxx>
#include <uno/mapping.hxx>
-
#include <cppuhelper/bootstrap.hxx>
-#include <bridges/java/jvmcontext.hxx>
-
-#include <jni.h>
+#include "jvm_uno_helper.h"
#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
using namespace ::rtl;
using namespace ::com::sun::star::uno;
+using namespace ::jvm_uno_helper;
-//--------------------------------------------------------------------------------------------------
-inline OUString jstring_to_oustring( jstring jstr, JNIEnv * jni_env )
+namespace jvm_uno_helper
+{
+//==================================================================================================
+void get_java_env( Environment * java_env, JNIEnv * jni_env ) SAL_THROW( () )
{
- OSL_ASSERT( sizeof (sal_Unicode) == sizeof (jchar) );
- jsize len = jni_env->GetStringLength( jstr );
- rtl_uString * ustr =
- (rtl_uString *)rtl_allocateMemory( sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) );
- jni_env->GetStringRegion( jstr, 0, len, ustr->buffer );
- if (JNI_FALSE != jni_env->ExceptionCheck())
+ OUString java_env_name = OUSTR(UNO_LB_JAVA);
+
+ uno_Environment ** java_envs;
+ sal_Int32 nSize;
+ uno_getRegisteredEnvironments(
+ &java_envs, &nSize, (uno_memAlloc)rtl_allocateMemory, java_env_name.pData );
+ if (0 < nSize)
{
- jni_env->ExceptionClear();
- rtl_freeMemory( ustr );
- throw RuntimeException( OUSTR("string error!"), Reference< XInterface >() );
+ java_env->operator = ( java_envs[ 0 ] );
+ while (nSize--)
+ {
+ (*java_envs[ nSize ]->release)( java_envs[ nSize ] );
+ }
+ rtl_freeMemory( java_envs );
+ }
+ else
+ {
+ JavaVM * vm;
+ jni_env->GetJavaVM( &vm );
+ ::JavaVMContext * jvm_context = new JavaVMContext( vm );
+ JVM_registration_guard guard( jvm_context );
+ uno_getEnvironment( (uno_Environment **)java_env, java_env_name.pData, jvm_context );
}
- ustr->refCount = 1;
- ustr->length = len;
- ustr->buffer[ len ] = '\0';
- return OUString( ustr, SAL_NO_ACQUIRE );
+}
}
//==================================================================================================
@@ -141,9 +149,20 @@ extern "C" JNIEXPORT jobject JNICALL Java_com_sun_star_comp_helper_Bootstrap_cpp
}
}
- Reference< XComponentContext > xContext;
+ // env
+ OUString cpp_env_name = OUSTR(CPPU_CURRENT_LANGUAGE_BINDING_NAME);
+ Environment cpp_env, java_env;
+ uno_getEnvironment( (uno_Environment **)&cpp_env, cpp_env_name.pData, 0 );
+ if (! cpp_env.is())
+ throw RuntimeException( OUSTR("cannot get cpp env!"), Reference< XInterface >() );
+ get_java_env( &java_env, jni_env );
+ if (! java_env.is())
+ throw RuntimeException( OUSTR("cannot get java env!"), Reference< XInterface >() );
+ // register before doing any complex uno that may call java (beware of detaching!)
+ JVM_registration_guard( java_env.get() );
// bootstrap uno
+ Reference< XComponentContext > xContext;
if (0 == juno_rc)
{
xContext = ::cppu::defaultBootstrap_InitialComponentContext();
@@ -155,52 +174,18 @@ extern "C" JNIEXPORT jobject JNICALL Java_com_sun_star_comp_helper_Bootstrap_cpp
}
// map to java
- OUString java_env_name = OUSTR(UNO_LB_JAVA);
- OUString cpp_env_name = OUSTR(CPPU_CURRENT_LANGUAGE_BINDING_NAME);
- Environment cpp_env, java_env;
- uno_getEnvironment( (uno_Environment **)&cpp_env, cpp_env_name.pData, 0 );
- if (! cpp_env.is())
- throw RuntimeException( OUSTR("cannot get cpp env!"), Reference< XInterface >() );
-
- JavaVMContext * jvm_context;
-
- uno_Environment ** java_envs;
- sal_Int32 nSize;
- uno_getRegisteredEnvironments(
- &java_envs, &nSize, (uno_memAlloc)rtl_allocateMemory, java_env_name.pData );
- if (nSize)
- {
- *(uno_Environment **)&java_env = java_envs[ 0 ];
- jvm_context = (JavaVMContext *)java_env.getContext();
-
- for( sal_Int32 i = 1; i < nSize; ++ i )
- {
- (*java_envs[ i ]->release)( java_envs[ i ] );
- }
- rtl_freeMemory( java_envs );
- }
- else
- {
- JavaVM * vm;
- jni_env->GetJavaVM( &vm );
- jvm_context = new JavaVMContext( vm );
- uno_getEnvironment( (uno_Environment **)&java_env, java_env_name.pData, jvm_context );
- }
-
- if (! java_env.is())
- throw RuntimeException( OUSTR("cannot get java env!"), Reference< XInterface >() );
-
- jvm_context->registerThread();
-
Mapping mapping( cpp_env.get(), java_env.get() );
if (! mapping.is())
- throw RuntimeException( OUSTR("cannot get mapping!"), Reference< XInterface >() );
+ {
+ throw RuntimeException(
+ OUSTR("cannot get mapping C++ <-> Java!"),
+ Reference< XInterface >() );
+ }
jobject jret = (jobject)mapping.mapInterface( xContext.get(), ::getCppuType( &xContext ) );
jobject jlocal = jni_env->NewLocalRef( jret );
jni_env->DeleteGlobalRef( jret );
- jvm_context->revokeThread();
return jlocal;
}
catch (RuntimeException & exc)