From c4d0567a8ab421f7ab036f74dfdd89cad07a0dd3 Mon Sep 17 00:00:00 2001 From: Jesper Smith Date: Wed, 26 Jul 2017 16:41:09 -0500 Subject: [PATCH] Provided access to the library loading code to allow custom library loaders --- port/jassimp/jassimp/src/jassimp/AiMesh.java | 6 +- port/jassimp/jassimp/src/jassimp/AiNodeAnim.java | 6 +- port/jassimp/jassimp/src/jassimp/Jassimp.java | 84 ++++++++++++++++------ .../jassimp/src/jassimp/JassimpLibraryLoader.java | 51 +++++++++++++ 4 files changed, 121 insertions(+), 26 deletions(-) create mode 100644 port/jassimp/jassimp/src/jassimp/JassimpLibraryLoader.java diff --git a/port/jassimp/jassimp/src/jassimp/AiMesh.java b/port/jassimp/jassimp/src/jassimp/AiMesh.java index c2ebcd3..b6a478d 100644 --- a/port/jassimp/jassimp/src/jassimp/AiMesh.java +++ b/port/jassimp/jassimp/src/jassimp/AiMesh.java @@ -140,17 +140,17 @@ public final class AiMesh { /** * Number of bytes per float value. */ - private static final int SIZEOF_FLOAT = Jassimp.NATIVE_FLOAT_SIZE; + private final int SIZEOF_FLOAT = Jassimp.NATIVE_FLOAT_SIZE; /** * Number of bytes per int value. */ - private static final int SIZEOF_INT = Jassimp.NATIVE_INT_SIZE; + private final int SIZEOF_INT = Jassimp.NATIVE_INT_SIZE; /** * Size of an AiVector3D in the native world. */ - private static final int SIZEOF_V3D = Jassimp.NATIVE_AIVEKTOR3D_SIZE; + private final int SIZEOF_V3D = Jassimp.NATIVE_AIVEKTOR3D_SIZE; /** diff --git a/port/jassimp/jassimp/src/jassimp/AiNodeAnim.java b/port/jassimp/jassimp/src/jassimp/AiNodeAnim.java index cb1c698..fb317a5 100644 --- a/port/jassimp/jassimp/src/jassimp/AiNodeAnim.java +++ b/port/jassimp/jassimp/src/jassimp/AiNodeAnim.java @@ -70,17 +70,17 @@ public final class AiNodeAnim { /** * Size of one position key entry. */ - private static final int POS_KEY_SIZE = Jassimp.NATIVE_AIVEKTORKEY_SIZE; + private final int POS_KEY_SIZE = Jassimp.NATIVE_AIVEKTORKEY_SIZE; /** * Size of one rotation key entry. */ - private static final int ROT_KEY_SIZE = Jassimp.NATIVE_AIQUATKEY_SIZE; + private final int ROT_KEY_SIZE = Jassimp.NATIVE_AIQUATKEY_SIZE; /** * Size of one scaling key entry. */ - private static final int SCALE_KEY_SIZE = Jassimp.NATIVE_AIVEKTORKEY_SIZE; + private final int SCALE_KEY_SIZE = Jassimp.NATIVE_AIVEKTORKEY_SIZE; /** diff --git a/port/jassimp/jassimp/src/jassimp/Jassimp.java b/port/jassimp/jassimp/src/jassimp/Jassimp.java index 97da269..92f4864 100644 --- a/port/jassimp/jassimp/src/jassimp/Jassimp.java +++ b/port/jassimp/jassimp/src/jassimp/Jassimp.java @@ -59,7 +59,7 @@ import java.util.Set; * Pointer comparison will fail. */ public final class Jassimp { - + /** * The default wrapper provider using built in types. */ @@ -91,6 +91,8 @@ public final class Jassimp { public static AiScene importFile(String filename, Set postProcessing) throws IOException { + loadLibrary(); + return aiImportFile(filename, AiPostProcessSteps.toRawValue( postProcessing)); } @@ -177,6 +179,11 @@ public final class Jassimp { } + public static void setLibraryLoader(JassimpLibraryLoader libraryLoader) { + s_libraryLoader = libraryLoader; + } + + /** * Helper method for wrapping a matrix.

* @@ -264,6 +271,35 @@ public final class Jassimp { return s_wrapperProvider.wrapSceneNode(parent, matrix, meshRefs, name); } + /** + * Helper method to load the library using the provided JassimpLibraryLoader.

+ * + * Synchronized to avoid race conditions. + */ + private static void loadLibrary() + { + if(!s_libraryLoaded) + { + synchronized(s_libraryLoadingLock) + { + if(!s_libraryLoaded) + { + s_libraryLoader.loadLibrary(); + NATIVE_AIVEKTORKEY_SIZE = getVKeysize(); + NATIVE_AIQUATKEY_SIZE = getQKeysize(); + NATIVE_AIVEKTOR3D_SIZE = getV3Dsize(); + NATIVE_FLOAT_SIZE = getfloatsize(); + NATIVE_INT_SIZE = getintsize(); + NATIVE_UINT_SIZE = getuintsize(); + NATIVE_DOUBLE_SIZE = getdoublesize(); + NATIVE_LONG_SIZE = getlongsize(); + + s_libraryLoaded = true; + } + } + + } + } /** * The native interface. @@ -285,30 +321,38 @@ public final class Jassimp { /** + * The library loader to load the native library. + */ + private static JassimpLibraryLoader s_libraryLoader = + new JassimpLibraryLoader(); + + /** + * Status flag if the library is loaded. + * + * Volatile to avoid problems with double checked locking. + * + */ + private static volatile boolean s_libraryLoaded = false; + + /** + * Lock for library loading. + */ + private static final Object s_libraryLoadingLock = new Object(); + + /** * Pure static class, no accessible constructor. */ private Jassimp() { /* nothing to do */ } - public static final int NATIVE_AIVEKTORKEY_SIZE; - public static final int NATIVE_AIQUATKEY_SIZE; - public static final int NATIVE_AIVEKTOR3D_SIZE; - public static final int NATIVE_FLOAT_SIZE; - public static final int NATIVE_INT_SIZE; - public static final int NATIVE_UINT_SIZE; - public static final int NATIVE_DOUBLE_SIZE; - public static final int NATIVE_LONG_SIZE; + public static int NATIVE_AIVEKTORKEY_SIZE; + public static int NATIVE_AIQUATKEY_SIZE; + public static int NATIVE_AIVEKTOR3D_SIZE; + public static int NATIVE_FLOAT_SIZE; + public static int NATIVE_INT_SIZE; + public static int NATIVE_UINT_SIZE; + public static int NATIVE_DOUBLE_SIZE; + public static int NATIVE_LONG_SIZE; - static { -// System.loadLibrary("jassimp"); - NATIVE_AIVEKTORKEY_SIZE = getVKeysize(); - NATIVE_AIQUATKEY_SIZE = getQKeysize(); - NATIVE_AIVEKTOR3D_SIZE = getV3Dsize(); - NATIVE_FLOAT_SIZE = getfloatsize(); - NATIVE_INT_SIZE = getintsize(); - NATIVE_UINT_SIZE = getuintsize(); - NATIVE_DOUBLE_SIZE = getdoublesize(); - NATIVE_LONG_SIZE = getlongsize(); - } } diff --git a/port/jassimp/jassimp/src/jassimp/JassimpLibraryLoader.java b/port/jassimp/jassimp/src/jassimp/JassimpLibraryLoader.java new file mode 100644 index 0000000..45e2756 --- /dev/null +++ b/port/jassimp/jassimp/src/jassimp/JassimpLibraryLoader.java @@ -0,0 +1,51 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library - Java Binding (jassimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2012, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +package jassimp; + +public class JassimpLibraryLoader +{ + static final JassimpLibraryLoader instance = new JassimpLibraryLoader(); + + public void loadLibrary() + { + System.loadLibrary("jassimp"); + } +} -- 2.7.4