diff options
Diffstat (limited to 'include/jvmaccess')
-rw-r--r-- | include/jvmaccess/classpath.hxx | 88 | ||||
-rw-r--r-- | include/jvmaccess/jvmaccessdllapi.h | 24 | ||||
-rw-r--r-- | include/jvmaccess/unovirtualmachine.hxx | 100 | ||||
-rw-r--r-- | include/jvmaccess/virtualmachine.hxx | 154 |
4 files changed, 366 insertions, 0 deletions
diff --git a/include/jvmaccess/classpath.hxx b/include/jvmaccess/classpath.hxx new file mode 100644 index 0000000000..6a082fc78d --- /dev/null +++ b/include/jvmaccess/classpath.hxx @@ -0,0 +1,88 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_JVMACCESS_CLASSPATH_HXX +#define INCLUDED_JVMACCESS_CLASSPATH_HXX + +#include <sal/config.h> + +#if defined __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunknown-attributes" +#endif +#include <jni.h> +#if defined __clang__ +#pragma clang diagnostic pop +#endif + +#include <jvmaccess/jvmaccessdllapi.h> + +#include <string_view> + +namespace com::sun::star::uno +{ +class XComponentContext; +} + +namespace com::sun::star::uno +{ +template <typename> class Reference; +} + +namespace jvmaccess +{ +/** + Helper functions for class path handling. + */ +namespace ClassPath +{ +/** + translates a class path into a java.net.URL[] instance. + + @param context + a component context; must not be null. + + @param environment + a JNI environment; must not be null. + + @param classPath + a list of zero or more internal (see the + com.sun.star.uri.ExternalUriReferenceTranslator service) URI references, + where any space characters (U+0020) are ignored (and, in particular, separate + adjacent URI references). Any vnd.sun.star.expand URL references in the list + are expanded using the com.sun.star.util.theMacroExpander singleton of the + given context. + + @returns + a local reference to a java.net.URL[] instance containing the external (see + the com.sun.star.uri.ExternalUriReferenceTranslator service) equivalents of + all the URI references in the given classPath. If null, a (still pending) + JNI exception occurred. + + @throws com::sun::star::uno::RuntimeException + */ +JVMACCESS_DLLPUBLIC jobjectArray +translateToUrls(css::uno::Reference<css::uno::XComponentContext> const& context, + JNIEnv* environment, std::u16string_view classPath); +} +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/jvmaccess/jvmaccessdllapi.h b/include/jvmaccess/jvmaccessdllapi.h new file mode 100644 index 0000000000..1c57d14842 --- /dev/null +++ b/include/jvmaccess/jvmaccessdllapi.h @@ -0,0 +1,24 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#ifndef INCLUDED_JVMACCESS_JVMACCESSDLLAPI_H +#define INCLUDED_JVMACCESS_JVMACCESSDLLAPI_H + +#include <sal/types.h> + +#if defined JVMACCESS_DLLIMPLEMENTATION +#define JVMACCESS_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define JVMACCESS_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif +#define JVMACCESS_DLLPRIVATE SAL_DLLPRIVATE + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/jvmaccess/unovirtualmachine.hxx b/include/jvmaccess/unovirtualmachine.hxx new file mode 100644 index 0000000000..1b424dba9c --- /dev/null +++ b/include/jvmaccess/unovirtualmachine.hxx @@ -0,0 +1,100 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_JVMACCESS_UNOVIRTUALMACHINE_HXX +#define INCLUDED_JVMACCESS_UNOVIRTUALMACHINE_HXX + +#include <jvmaccess/jvmaccessdllapi.h> +#include <sal/config.h> +#include <salhelper/simplereferenceobject.hxx> +#include <rtl/ref.hxx> + +namespace jvmaccess +{ +class VirtualMachine; + +/** An encapsulating wrapper around a Java virtual machine and an appropriate + UNO class loader. + */ +class JVMACCESS_DLLPUBLIC UnoVirtualMachine final : public salhelper::SimpleReferenceObject +{ +public: + /** An exception indicating failure to create a UnoVirtualMachine. + */ + class JVMACCESS_DLLPUBLIC CreationException final + { + public: + CreationException(); + + CreationException(CreationException const&); + + CreationException& operator=(CreationException const&); + }; + + /** Create a wrapper around a Java virtual machine and an appropriate UNO + class loader. + + @param virtualMachine + A Java virtual machine wrapper. Must not be null. + + @param classLoader + A local or global JNI reference, relative to the given virtualMachine, + to an appropriate UNO class loader instance. Must not be null. This + parameter should be of type jobject, not void *, but the exact + definition of jobject is different for different JDK versions, so that + the mangled C++ name of the constructor would depend on the JDK version + used at compile time. + + @exception CreationException + Thrown in case creation fails (due to a JNI problem). + */ + UnoVirtualMachine(rtl::Reference<jvmaccess::VirtualMachine> virtualMachine, void* classLoader); + + /** Get the Java virtual machine wrapper. + + @return + The Java virtual machine wrapper. Will never be null. + */ + const rtl::Reference<jvmaccess::VirtualMachine>& getVirtualMachine() const; + + /** Get the UNO class loader. + + @return + A global JNI reference to the UNO class loader. (The JNI reference must + not be deleted by client code.) Will never be null. This should be of + type jobject, not void *, but the exact definition of jobject is + different for different JDK versions, so that the mangled C++ name of + the function would depend on the JDK version used at compile time. + */ + void* getClassLoader() const { return m_classLoader; } + +private: + UnoVirtualMachine(UnoVirtualMachine const&) = delete; + UnoVirtualMachine& operator=(UnoVirtualMachine const&) = delete; + + virtual ~UnoVirtualMachine() override; + + rtl::Reference<jvmaccess::VirtualMachine> m_virtualMachine; + void* m_classLoader; +}; +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/jvmaccess/virtualmachine.hxx b/include/jvmaccess/virtualmachine.hxx new file mode 100644 index 0000000000..e1286e7001 --- /dev/null +++ b/include/jvmaccess/virtualmachine.hxx @@ -0,0 +1,154 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_JVMACCESS_VIRTUALMACHINE_HXX +#define INCLUDED_JVMACCESS_VIRTUALMACHINE_HXX + +#include <jvmaccess/jvmaccessdllapi.h> +#include <rtl/ref.hxx> +#include <salhelper/simplereferenceobject.hxx> + +#if defined __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunknown-attributes" +#endif +#include <jni.h> +#if defined __clang__ +#pragma clang diagnostic pop +#endif + +namespace jvmaccess +{ +/** An encapsulating wrapper around a Java virtual machine. + */ +class JVMACCESS_DLLPUBLIC VirtualMachine final : public salhelper::SimpleReferenceObject +{ +public: + /** A helper to attach a thread to a Java virtual machine. + + @descr + Upon construction of a guard the current thread is attached to the + virtual machine, and upon destruction of the guard the thread is + detached again. For any one thread, multiple instances of this class + may be used in a stack-like fashion (care is taken to only really + detach the thread from the virtual machine upon destruction of the guard + at the bottom of the stack). + */ + class JVMACCESS_DLLPUBLIC AttachGuard + { + public: + /** An exception indicating failure to create an AttachGuard. + */ + class JVMACCESS_DLLPUBLIC CreationException final + { + public: + CreationException(); + + CreationException(CreationException const&); + + CreationException& operator=(CreationException const&); + }; + + /** Attach the current thread to a virtual machine. + + @param rMachine + The virtual machine to attach to. Must not be a null reference. + + @exception CreationException + Thrown in case attaching fails (due to a JNI problem). + */ + explicit AttachGuard(rtl::Reference<VirtualMachine> xMachine); + + /** Detach the current thread from the virtual machine again. + */ + ~AttachGuard(); + + /** Get a JNI environment pointer for the current thread. + + @return + A valid JNI environment pointer. Will never be null. + */ + JNIEnv* getEnvironment() const { return m_pEnvironment; } + + private: + AttachGuard(AttachGuard const&) = delete; + AttachGuard& operator=(AttachGuard const&) = delete; + + rtl::Reference<VirtualMachine> m_xMachine; + JNIEnv* m_pEnvironment; + bool m_bDetach; + }; + + /** Create a wrapper around a Java virtual machine. + + @param pVm + A JNI pointer to virtual machine. Must not be null. + + @param nVersion + The JNI version of the virtual machine pointed to by pVm. Must be at + least JNI_VERSION_1_2. This parameter should be of type jint, not int, + but at least on some platforms the definition of jint changed from + JDK 1.3 (long) to JDK 1.4 (int), so that the mangled C++ name of the + constructor would depend on the JDK version used at compile time. + + @param bDestroy + Whether to destroy the virtual machine when destructing the wrapper + (i.e., whether the wrapper owns the virtual machine pointed to by pVm). + + @param pMainThreadEnv + A valid JNI environment pointer for the current thread; must not be + null. The current thread must be "initially attached" to the virtual + machine while this constructor is being called (i.e., it must be the + thread that has called JNI_CreateJavaVM in case the virtual machine has + been started via the JNI Invocation API, and it must not already have + called DetachCurrentThread; or it must be executing native code called + from a "primordial" virtual machine). This environment pointer was + formerly used to obtain a reference to the thread's current context + class loader (java.lang.Thread.getCurrentClassLoader; if later a native + thread was attached to the virtual machine, that thread's context class + loader would be null, so the AttachGuard first of all set it to the + saved value; this feature has been removed again for performance reasons + and because the default context class loader is often not useful, so + that code relying on a context class loader has to set one explicitly, + anyway). This parameter is currently unused (but may be used again in + the future). + */ + VirtualMachine(JavaVM* pVm, int nVersion, bool bDestroy, JNIEnv const* pMainThreadEnv); + +private: + VirtualMachine(VirtualMachine const&) = delete; + VirtualMachine& operator=(VirtualMachine const&) = delete; + + virtual ~VirtualMachine() override; + + JNIEnv* attachThread(bool* pAttached) const; + + void detachThread() const; + + JavaVM* m_pVm; + jint m_nVersion; + bool m_bDestroy; + + friend class AttachGuard; // to access attachThread, detachThread +}; +} + +#endif // INCLUDED_JVMACCESS_VIRTUALMACHINE_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |