在Mac OS X NetBeans上使用sqlite4java Jar的UnsatisfiedLinkError

我遇到了与此问题类似的问题:

在Mac OS X上使用sqlite4java Jar的UnsatisfiedLinkError

但是,我在Mac上运行,并且我的lib文件夹中有相关的库。 但是,如果我按原样运行,我会收到UnsatisfiedLinkError。 如果我运行“java -jar sqlite4java.jar -d”,我会得到以下输出:

sqlite4java 282 130321:222850.424 FINE [sqlite] Internal: loading library 130321:222850.425 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 130321:222850.425 FINE [sqlite] Internal: sqlite4java.library.path=null 130321:222850.425 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/lib/. 130321:222850.425 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib 130321:222850.425 FINE [sqlite] Internal: forced path=null 130321:222850.426 FINE [sqlite] Internal: os.name=mac os x; os=osx 130321:222850.426 FINE [sqlite] Internal: os.arch=x86_64 130321:222850.426 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 130321:222850.427 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 130321:222850.427 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64 130321:222850.428 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64 in java.library.path 130321:222850.428 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4 130321:222850.431 INFO [sqlite] Internal: loaded sqlite4java-osx-10.4 from system path 130321:222850.433 INFO [sqlite] Internal: loaded sqlite 3.7.10, wrapper 0.2 SQLite 3.7.10 Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS ENABLE_LOCKING_STYLE=0 ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1 

我可以看到它正在寻找sqlite4java-osx-x86_64库,所以我然后运行了两个“ln -s libsqlite4java-osx.jnilib libsqlite4java-osx-x86_64.jnilib”和“ln -s libsqlite4java-osx-10.4.jnilib” libsqlite4java-osx-x86_64.jnilib“这似乎有所帮助:

 sqlite4java 282 130321:223211.473 FINE [sqlite] Internal: loading library 130321:223211.474 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 130321:223211.474 FINE [sqlite] Internal: sqlite4java.library.path=null 130321:223211.474 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/lib/. 130321:223211.474 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib 130321:223211.474 FINE [sqlite] Internal: forced path=null 130321:223211.475 FINE [sqlite] Internal: os.name=mac os x; os=osx 130321:223211.475 FINE [sqlite] Internal: os.arch=x86_64 130321:223211.475 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 130321:223211.477 INFO [sqlite] Internal: loaded sqlite4java-osx-x86_64 from system path 130321:223211.479 INFO [sqlite] Internal: loaded sqlite 3.7.10, wrapper 0.2 SQLite 3.7.10 Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1 

看起来很好,对吗? 当我尝试运行我的java代码时,尝试使用UnsatisfiedLinkError打开数据库时,它再次失败。

有什么明显的东西我不见了吗? 这是我的lib目录中相关部分的ls,只是作为一个完整性检查:

 -rw-r--r--@ 1 mikey staff 466792 1 Mar 2012 libsqlite4java-android-armv7.so -rw-r--r--@ 1 mikey staff 790986 1 Mar 2012 libsqlite4java-linux-amd64.so -rw-r--r--@ 1 mikey staff 732637 1 Mar 2012 libsqlite4java-linux-i386.so -rw-r--r--@ 1 mikey staff 1400368 1 Mar 2012 libsqlite4java-osx-10.4.jnilib -rw-r--r--@ 1 mikey staff 1401592 1 Mar 2012 libsqlite4java-osx-ppc.jnilib lrwxr-xr-x 1 mikey staff 25 21 Mar 22:31 libsqlite4java-osx-x86_64.jnilib -> libsqlite4java-osx.jnilib -rw-r--r--@ 1 mikey staff 1433640 1 Mar 2012 libsqlite4java-osx.jnilib -rw-r--r-- 1 mikey staff 928 17 Mar 17:05 nblibraries.properties drwxr-xr-x 3 mikey staff 102 15 Mar 18:59 sqlite4java drwxr-xr-x 13 mikey staff 442 19 Mar 17:49 sqlite4java-282 2 -rw-r--r--@ 1 mikey staff 102236 1 Mar 2012 sqlite4java-docs.zip -rw-r--r--@ 1 mikey staff 100502 1 Mar 2012 sqlite4java-src.zip -rw-r--r--@ 1 mikey staff 622080 1 Mar 2012 sqlite4java-win32-x64.dll -rw-r--r--@ 1 mikey staff 462848 1 Mar 2012 sqlite4java-win32-x86.dll -rw-r--r--@ 1 mikey staff 129381 1 Mar 2012 sqlite4java.jar 

以及我的数据库连接代码的副本:

 import com.almworks.sqlite4java.SQLiteConnection; import com.almworks.sqlite4java.SQLiteException; import java.io.File; import java.util.logging.Level; import java.util.logging.Logger; /** * Wrapper for Sqlite * * @author mikey */ public class Database { private SQLiteConnection db; public Database() { db = new SQLiteConnection(new File("./test.db")); try { db.open(true); } catch (SQLiteException ex) { Logger.getLogger(Database.class.getName()).log(Level.SEVERE, null, ex); } } } 

感谢你能解决我的问题……

编辑

为了回应@sereda,这里是输出“com.almworks.sqlite4java.SQLite.main(new String [] {” – d“});” 进入数据库连接代码:

 sqlite4java 282 130322:161109.097 FINE [sqlite] Internal: loading library 130322:161109.099 FINE [sqlite] Internal: java.library.path=/Users/mikey/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 130322:161109.100 FINE [sqlite] Internal: sqlite4java.library.path=null 130322:161109.100 FINE [sqlite] Internal: cwd=/Users/mikey/NetBeansProjects/Test/. 130322:161109.101 FINE [sqlite] Internal: default path=/Users/mikey/NetBeansProjects/Test/lib 130322:161109.101 FINE [sqlite] Internal: forced path=null 130322:161109.102 FINE [sqlite] Internal: os.name=mac os x; os=osx 130322:161109.102 FINE [sqlite] Internal: os.arch=x86_64 130322:161109.105 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 130322:161109.108 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 130322:161109.108 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64 130322:161109.112 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64 in java.library.path 130322:161109.112 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4 130322:161109.115 FINE [sqlite] Internal: cannot load sqlite4java-osx-10.4: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-10.4 in java.library.path 130322:161109.115 FINE [sqlite] Internal: trying to load sqlite4java-osx 130322:161109.118 FINE [sqlite] Internal: cannot load sqlite4java-osx: java.lang.UnsatisfiedLinkError: no sqlite4java-osx in java.library.path 130322:161109.119 FINE [sqlite] Internal: trying to load sqlite4java 130322:161109.122 FINE [sqlite] Internal: cannot load sqlite4java: java.lang.UnsatisfiedLinkError: no sqlite4java in java.library.path 130322:161109.123 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64-d 130322:161109.127 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64-d in java.library.path 130322:161109.127 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64-d 130322:161109.131 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64-d in java.library.path 130322:161109.131 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4-d 130322:161109.134 FINE [sqlite] Internal: cannot load sqlite4java-osx-10.4-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-10.4-d in java.library.path 130322:161109.134 FINE [sqlite] Internal: trying to load sqlite4java-osx-d 130322:161109.137 FINE [sqlite] Internal: cannot load sqlite4java-osx-d: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-d in java.library.path 130322:161109.138 FINE [sqlite] Internal: trying to load sqlite4java-d 130322:161109.141 FINE [sqlite] Internal: cannot load sqlite4java-d: java.lang.UnsatisfiedLinkError: no sqlite4java-d in java.library.path Error: cannot load SQLite java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860) at java.lang.Runtime.loadLibrary0(Runtime.java:845) at java.lang.System.loadLibrary(System.java:1084) at com.almworks.sqlite4java.Internal.tryLoadFromSystemPath(Internal.java:349) at com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:124) at com.almworks.sqlite4java.SQLite.main(SQLite.java:368) at frakdeck.Database.(Database.java:19) at frakdeck.Test.start(Test.java:22) at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319) at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179) at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76) 

这是以下解决方案:

 Exception in thread "main" com.almworks.sqlite4java.SQLiteException: [-91]cannot load library: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 

请尝试运行此:

  java -jar sqlite4java.jar -d 

使其尝试加载二进制文件的所有变体并validation结果。

结果必须是这样的:

 java -jar sqlite4java.jar -d sqlite4java 282 121212:134119.239 FINE [sqlite] Internal: loading library 121212:134119.239 FINE [sqlite] Internal:java.library.path=/Users/XXXXX/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. 121212:134119.240 FINE [sqlite] Internal: sqlite4java.library.path=null 121212:134119.240 FINE [sqlite] Internal: cwd=XXXXX 121212:134119.240 FINE [sqlite] Internal: default path=XXXXX 121212:134119.240 FINE [sqlite] Internal: forced path=null 121212:134119.240 FINE [sqlite] Internal: os.name=mac os x; os=osx 121212:134119.240 FINE [sqlite] Internal: os.arch=x86_64 121212:134119.240 FINE [sqlite] Internal: trying to load sqlite4java-osx-x86_64 121212:134119.243 FINE [sqlite] Internal: cannot load sqlite4java-osx-x86_64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64 in java.library.path 121212:134119.243 FINE [sqlite] Internal: trying to load sqlite4java-osx-amd64 121212:134119.244 FINE [sqlite] Internal: cannot load sqlite4java-osx-amd64: java.lang.UnsatisfiedLinkError: no sqlite4java-osx-amd64 in java.library.path 121212:134119.244 FINE [sqlite] Internal: trying to load sqlite4java-osx-10.4 121212:134119.249 INFO [sqlite] Internal: loaded sqlite4java-osx-10.4 from system path 121212:134119.252 INFO [sqlite] Internal: loaded sqlite 3.7.10, wrapper 0.2 SQLite 3.7.10 Compile-time options: ENABLE_COLUMN_METADATA ENABLE_FTS3 ENABLE_FTS3_PARENTHESIS ENABLE_LOCKING_STYLE=0 ENABLE_MEMORY_MANAGEMENT ENABLE_RTREE OMIT_DEPRECATED TEMP_STORE=1 THREADSAFE=1 

这些文件按照更具体的特定顺序进行尝试。 所以订单是正确的。

问题是没有更具体的二进制文件 – 我们可能需要将libsqlite4java-osx.jnilib重命名为libsqlite4java-osx-amd64.dylib

升级到Mountain Lion后,我的程序出现了同样的错误。 当我将库添加到/ Libraries / Java / Extensions时,程序运行正常。 我不知道这是否是最好的解决方案,但它确实有效。

不确定究竟是什么问题,但您可以尝试从程序中运行sqlite4java的诊断代码,看看它是否显示相同的加载顺序:

 public Database() { com.almworks.sqlite4java.SQLite.main(new String[] {"-d"}); db = new SQLiteConnection(new File("./test.db")); ... 

我有同样的问题,但设法通过从IDE创建libs文件夹然后将jar复制到新的libs文件夹来加载sqlite。 然后我从构建路径中删除了旧版本的jar并添加到新版本中。 希望这可以帮助!