From 4e4dcdae48dcd0437ff3f87a1ffc4fada53f2e3f Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Mon, 11 Jun 2012 18:02:56 +0300 Subject: Add Android-specific sal/ByteBufferWrapper.hxx header Used for impedance matching between Java's direct ByteBuffer and the boost::shared_array used by basebmp. Not sure yet how well this will actually work. I'm afraid leaks might be possible in exception throwing cases. Change-Id: I74fc57aaf46b2dd9f227043bd9045d4815a5ed40 --- sal/Package_inc.mk | 1 + sal/inc/sal/ByteBufferWrapper.hxx | 51 +++++++++++++++++++++++++++++++++++++++ touch/Library_libotouch.mk | 8 ++++++ touch/source/android/android.cxx | 36 +++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 sal/inc/sal/ByteBufferWrapper.hxx create mode 100644 touch/source/android/android.cxx diff --git a/sal/Package_inc.mk b/sal/Package_inc.mk index 1bce8ecd4aba..00dc323a2b4e 100644 --- a/sal/Package_inc.mk +++ b/sal/Package_inc.mk @@ -106,6 +106,7 @@ $(eval $(call gb_Package_add_file,sal_inc,inc/rtl/ustring.h,rtl/ustring.h)) $(eval $(call gb_Package_add_file,sal_inc,inc/rtl/ustring.hxx,rtl/ustring.hxx)) $(eval $(call gb_Package_add_file,sal_inc,inc/rtl/uuid.h,rtl/uuid.h)) $(eval $(call gb_Package_add_file,sal_inc,inc/sal/alloca.h,sal/alloca.h)) +$(eval $(call gb_Package_add_file,sal_inc,inc/sal/ByteBufferWrapper.hxx,sal/ByteBufferWrapper.hxx)) $(eval $(call gb_Package_add_file,sal_inc,inc/sal/config.h,sal/config.h)) $(eval $(call gb_Package_add_file,sal_inc,inc/sal/log-areas.dox,sal/log-areas.dox)) $(eval $(call gb_Package_add_file,sal_inc,inc/sal/log.hxx,sal/log.hxx)) diff --git a/sal/inc/sal/ByteBufferWrapper.hxx b/sal/inc/sal/ByteBufferWrapper.hxx new file mode 100644 index 000000000000..954922d65b16 --- /dev/null +++ b/sal/inc/sal/ByteBufferWrapper.hxx @@ -0,0 +1,51 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Copyright 2012 LibreOffice contributors. + * + * 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 _SAL_BYTEBUFFERWRAPPER_HXX +#define _SAL_BYTEBUFFERWRAPPER_HXX + +#ifdef ANDROID + +#include + +#include + +namespace org { namespace libreoffice { namespace touch { + +class ByteBufferWrapper +{ +private: + JNIEnv *env; + jobject object; + +public: + ByteBufferWrapper(JNIEnv *e, jobject o) : + env(e) + { + object = env->NewGlobalRef(o); + } + + sal_uInt8* pointer() + { + return (sal_uInt8 *) env->GetDirectBufferAddress(object); + } + + void operator()(sal_uInt8 * /* p */) + { + env->DeleteGlobalRef(object); + } +}; + +}; }; }; + +#endif + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/touch/Library_libotouch.mk b/touch/Library_libotouch.mk index be355e3868ad..418c31a989de 100644 --- a/touch/Library_libotouch.mk +++ b/touch/Library_libotouch.mk @@ -28,6 +28,14 @@ $(eval $(call gb_Library_add_exception_objects,libotouch,\ touch/source/generic/libotouch \ )) +ifeq ($(OS),ANDROID) + +$(eval $(call gb_Library_add_exception_objects,libotouch,\ + touch/source/android/android \ +)) + +endif + ifeq ($(OS),IOS) $(eval $(call gb_Library_add_objcxx_objects,libotouch,\ diff --git a/touch/source/android/android.cxx b/touch/source/android/android.cxx new file mode 100644 index 000000000000..06768c86c646 --- /dev/null +++ b/touch/source/android/android.cxx @@ -0,0 +1,36 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * Copyright 2012 LibreOffice contributors. + * + * 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/. + */ + +#include + +#include + +using org::libreoffice::touch::ByteBufferWrapper; + +extern "C" +__attribute__ ((visibility("default"))) +jlong +Java_org_libreoffice_android_Bootstrap_new_1byte_1buffer_1wrapper(JNIEnv *env, + jobject /* clazz */, + jobject bytebuffer) +{ + return (jlong) (intptr_t) new ByteBufferWrapper(env, bytebuffer); +} + +extern "C" +__attribute__ ((visibility("default"))) +void +Java_org_libreoffice_android_Bootstrap_delete_1byte_1buffer_1wrapper(JNIEnv * /* env */, + jobject /* clazz */, + jlong bbw) +{ + delete (ByteBufferWrapper*) (intptr_t) bbw; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit