diff options
Diffstat (limited to 'android/Bootstrap/src/org/libreoffice/kit/LibreOfficeKit.java')
-rw-r--r-- | android/Bootstrap/src/org/libreoffice/kit/LibreOfficeKit.java | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/android/Bootstrap/src/org/libreoffice/kit/LibreOfficeKit.java b/android/Bootstrap/src/org/libreoffice/kit/LibreOfficeKit.java new file mode 100644 index 000000000..f7597c29a --- /dev/null +++ b/android/Bootstrap/src/org/libreoffice/kit/LibreOfficeKit.java @@ -0,0 +1,111 @@ +/* -*- Mode: Java; 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/. + */ + +package org.libreoffice.kit; + +import android.app.Activity; +import android.content.pm.ApplicationInfo; +import android.content.res.AssetManager; +import android.util.Log; + +import java.io.InputStream; +import java.nio.ByteBuffer; + +// Native methods in this class are all implemented in +// sal/android/lo-bootstrap.c as the lo-bootstrap library is loaded with +// System.loadLibrary() and Android's JNI works only to such libraries, it +// seems. +public final class LibreOfficeKit +{ + private static String LOGTAG = LibreOfficeKit.class.getSimpleName(); + private static AssetManager mgr; + + // private constructor because instantiating would be meaningless + private LibreOfficeKit() { + } + + // Trigger library initialization - as this is done automatically by executing the "static" block, this method remains empty. However we need this to manually (at the right time) can force library initialization. + public static void initializeLibrary() { + } + + // Trigger initialization on the JNI - LOKit side. + private static native boolean initializeNative(String dataDir, String cacheDir, String apkFile, AssetManager mgr); + + public static native ByteBuffer getLibreOfficeKitHandle(); + + // Wrapper for putenv() + public static native void putenv(String string); + + // A method that starts a thread to redirect stdout and stderr writes to + // the Android logging mechanism, or stops the redirection. + public static native void redirectStdio(boolean state); + + static boolean initializeDone = false; + + // This init() method should be called from the upper Java level of + // LO-based apps. + public static synchronized void init(Activity activity) + { + if (initializeDone) { + return; + } + + mgr = activity.getResources().getAssets(); + + ApplicationInfo applicationInfo = activity.getApplicationInfo(); + String dataDir = applicationInfo.dataDir; + Log.i(LOGTAG, String.format("Initializing LibreOfficeKit, dataDir=%s\n", dataDir)); + + redirectStdio(true); + + String cacheDir = activity.getApplication().getCacheDir().getAbsolutePath(); + String apkFile = activity.getApplication().getPackageResourcePath(); + + if (!initializeNative(dataDir, cacheDir, apkFile, mgr)) { + Log.e(LOGTAG, "Initialize native failed!"); + return; + } + initializeDone = true; + } + + // Now with static loading we always have all native code in one native + // library which we always call liblo-native-code.so, regardless of the + // app. The library has already been unpacked into /data/data/<app + // name>/lib at installation time by the package manager. + static { + NativeLibLoader.load(); + } +} + +class NativeLibLoader { + private static boolean done = false; + + protected static synchronized void load() { + if (done) + return; + System.loadLibrary("nspr4"); + System.loadLibrary("plds4"); + System.loadLibrary("plc4"); + System.loadLibrary("nssutil3"); + System.loadLibrary("freebl3"); + System.loadLibrary("sqlite3"); + System.loadLibrary("softokn3"); + System.loadLibrary("nss3"); + System.loadLibrary("nssckbi"); + System.loadLibrary("nssdbm3"); + System.loadLibrary("smime3"); + System.loadLibrary("ssl3"); + + System.loadLibrary("c++_shared"); + System.loadLibrary("lo-native-code"); + done = true; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |