Provided access to the library loading code to allow custom library loaders
authorJesper Smith <jsmith@ihmc.us>
Wed, 26 Jul 2017 21:41:09 +0000 (16:41 -0500)
committerJesper Smith <jsmith@ihmc.us>
Wed, 26 Jul 2017 21:41:09 +0000 (16:41 -0500)
port/jassimp/jassimp/src/jassimp/AiMesh.java
port/jassimp/jassimp/src/jassimp/AiNodeAnim.java
port/jassimp/jassimp/src/jassimp/Jassimp.java
port/jassimp/jassimp/src/jassimp/JassimpLibraryLoader.java [new file with mode: 0644]

index c2ebcd3..b6a478d 100644 (file)
@@ -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;
     
     
     /**
index cb1c698..fb317a5 100644 (file)
@@ -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;
     
     
     /**
index 97da269..92f4864 100644 (file)
@@ -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<AiPostProcessSteps> 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.<p>
      * 
@@ -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.<p>
+     * 
+     * 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 (file)
index 0000000..45e2756
--- /dev/null
@@ -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");
+   }
+}