LibreOffice Module bridges (master) 1
jni_helper.h
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
20#pragma once
21
22#include <sal/config.h>
23
24#include <memory>
25
26#include "jni_base.h"
27#include "jni_info.h"
28
29
30namespace jni_uno
31{
32
34 JNI_context const & jni, rtl_uString ** out_ustr, jstring jstr )
35{
36 if (nullptr == jstr)
37 {
38 rtl_uString_new( out_ustr );
39 }
40 else
41 {
42 jsize len = jni->GetStringLength( jstr );
43 std::unique_ptr< rtl_mem > mem(
45 sizeof (rtl_uString) + (len * sizeof (sal_Unicode)) ) );
46 rtl_uString * ustr = reinterpret_cast<rtl_uString *>(mem.get());
47 jni->GetStringRegion( jstr, 0, len, reinterpret_cast<jchar *>(ustr->buffer) );
49 ustr->refCount = 1;
50 ustr->length = len;
51 ustr->buffer[ len ] = '\0';
52 // coverity[leaked_storage : FALSE] - transfer ownership to *out_ustr
53 mem.release();
54 if (nullptr != *out_ustr)
55 rtl_uString_release( *out_ustr );
56 *out_ustr = ustr;
57 }
58}
59
60inline OUString jstring_to_oustring(
61 JNI_context const & jni, jstring jstr )
62{
63 rtl_uString * ustr = nullptr;
64 jstring_to_ustring( jni, &ustr, jstr );
65 return OUString( ustr, SAL_NO_ACQUIRE );
66}
67
68inline jstring ustring_to_jstring(
69 JNI_context const & jni, rtl_uString const * ustr )
70{
71 jstring jstr = jni->NewString( reinterpret_cast<jchar const *>(ustr->buffer), ustr->length );
73 return jstr;
74}
75
76
77// if inException, does not handle exceptions, in which case returned value will
78// be null if exception occurred:
79inline jclass find_class(
80 JNI_context const & jni, char const * class_name, bool inException = false )
81{
82 // find_class may be called before the JNI_info is set:
83 jclass c=nullptr;
84 jmethodID m;
85 JNI_info const * info = jni.get_info();
86 if (info == nullptr) {
87 jni.getClassForName(&c, &m);
88 if (c == nullptr) {
89 if (inException) {
90 return nullptr;
91 }
93 }
94 } else {
95 c = info->m_class_Class;
97 }
98 return jni.findClass(class_name, c, m, inException);
99}
100
101
102inline jobject create_type( JNI_context const & jni, jclass clazz )
103{
104 JNI_info const * jni_info = jni.get_info();
105 jvalue arg;
106 arg.l = clazz;
107 jobject jo_type = jni->NewObjectA(
108 jni_info->m_class_Type, jni_info->m_ctor_Type_with_Class, &arg );
110 return jo_type;
111}
112
113inline jobject create_type(
114 JNI_context const & jni, typelib_TypeDescriptionReference * type )
115{
116 JNI_info const * jni_info = jni.get_info();
117 jvalue args[ 2 ];
118 // get type class
119 args[ 0 ].i = type->eTypeClass;
120 JLocalAutoRef jo_type_class(
121 jni, jni->CallStaticObjectMethodA(
122 jni_info->m_class_TypeClass,
123 jni_info->m_method_TypeClass_fromInt, args ) );
125 // construct type
126 JLocalAutoRef jo_type_name(
127 jni, ustring_to_jstring( jni, type->pTypeName ) );
128 args[ 0 ].l = jo_type_name.get();
129 args[ 1 ].l = jo_type_class.get();
130 jobject jo_type = jni->NewObjectA(
131 jni_info->m_class_Type,
134 return jo_type;
135}
136
137inline jobject compute_oid( JNI_context const & jni, jobject jo )
138{
139 JNI_info const * jni_info = jni.get_info();
140 jvalue arg;
141 arg.l= jo;
142 jobject jo_oid = jni->CallStaticObjectMethodA(
143 jni_info->m_class_UnoRuntime,
144 jni_info->m_method_UnoRuntime_generateOid, &arg );
146 return jo_oid;
147}
148
149}
150
151/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
jobject get() const
Definition: jni_base.h:156
jclass findClass(char const *name, jclass classClass, jmethodID methodForName, bool inException) const
Definition: jni_bridge.cxx:355
JNI_info const * get_info() const
Definition: jni_base.h:73
void ensure_no_exception() const
Definition: jni_base.h:97
void getClassForName(jclass *classClass, jmethodID *methodForName) const
Definition: jni_bridge.cxx:342
jclass m_class_UnoRuntime
Definition: jni_info.h:150
jclass m_class_TypeClass
Definition: jni_info.h:154
jmethodID m_method_Class_forName
Definition: jni_info.h:131
jmethodID m_method_TypeClass_fromInt
Definition: jni_info.h:188
jmethodID m_ctor_Type_with_Name_TypeClass
Definition: jni_info.h:186
jclass m_class_Type
Definition: jni_info.h:153
jclass m_class_Class
Definition: jni_info.h:130
jmethodID m_method_UnoRuntime_generateOid
Definition: jni_info.h:180
jmethodID m_ctor_Type_with_Class
Definition: jni_info.h:185
OUString jstring_to_oustring(JNI_context const &jni, jstring jstr)
Definition: jni_helper.h:60
void jstring_to_ustring(JNI_context const &jni, rtl_uString **out_ustr, jstring jstr)
Definition: jni_helper.h:33
jstring ustring_to_jstring(JNI_context const &jni, rtl_uString const *ustr)
Definition: jni_helper.h:68
jclass find_class(JNI_context const &jni, char const *class_name, bool inException=false)
Definition: jni_helper.h:79
jobject create_type(JNI_context const &jni, jclass clazz)
Definition: jni_helper.h:102
jobject compute_oid(JNI_context const &jni, jobject jo)
Definition: jni_helper.h:137
m
args
static rtl_mem * allocate(std::size_t bytes)
Definition: jni_base.h:219
sal_uInt16 sal_Unicode
ResultType type