簡體   English   中英

Scala SBT和JNI庫

[英]Scala SBT and JNI library

我正在Scala中編寫一個簡單的應用程序,該應用程序通過leveldbjni庫使用leveldb數據庫。 我的build.sbt文件如下所示:

name := "Whatever"

version := "1.0"

scalaVersion := "2.10.2"

libraryDependencies ++= Seq(
    "org.iq80.leveldb" % "leveldb-api" % "0.6",
    "org.fusesource.leveldbjni" % "leveldbjni-all" % "1.7"
)

然后, Object負責創建數據庫。 不幸的是,如果我運行該程序, hawtjni返回一個java.lang.UnsatisfiedLinkError ,它是由hawtjnileveldbjni利用的hawtjnileveldbjni的。

也可以從scala控制台輕松觸發該錯誤:

scala> import java.io.File
scala> import org.iq80.leveldb._
scala> import org.fusesource.leveldbjni.JniDBFactory._
scala> factory.open(new File("test"), new Options().createIfMissing(true))

java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V
    at org.fusesource.leveldbjni.internal.NativeOptions.init(Native Method)
    at org.fusesource.leveldbjni.internal.NativeOptions.<clinit>(NativeOptions.java:54)
    at org.fusesource.leveldbjni.JniDBFactory$OptionsResourceHolder.init(JniDBFactory.java:98)
    at org.fusesource.leveldbjni.JniDBFactory.open(JniDBFactory.java:167)
    at .<init>(<console>:15)
...
scala> System getProperty "java.io.tmpdir"
res2: String = /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/

我不明白發生了什么事,因為該庫已從jar文件中正確提取,但由於某些原因未加載。

$ file /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/lib*
/var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/libleveldbjni-1.7.jnilib:    Mach-O universal binary with 2 architectures
/var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/libleveldbjni-1.7.jnilib (for architecture x86_64):    Mach-O 64-bit dynamically linked shared library x86_64
/var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/T/libleveldbjni-1.7.jnilib (for architecture i386):  Mach-O dynamically linked shared library i386

我認為問題可能與sbt所使用的類加載器有關,但是我不確定,因為我對scala比較陌生。

更新

仍然沒有找到肇事者或罪魁禍首。 無論如何,實際上可以找到並正確加載該庫,因為我可以執行以下命令:

scalac> import org.fusesource.leveldbjni.internal.NativeDB
scalac> NativeDB.LIBRARY.load()

該錯誤是由於init()函數所致,根據hawtjni 文檔 ,該函數負責將所有標注為具有常量value的靜態字段設置為常量字段 仍然可以通過鍵入以下內容觸發異常:

scalac> import org.fusesource.leveldbjni.internal.NativeOptions
scalac> new NativeOptions()
java.lang.UnsatisfiedLinkError: org.fusesource.leveldbjni.internal.NativeOptions.init()V
    at org.fusesource.leveldbjni.internal.NativeOptions.init(Native Method)
    at org.fusesource.leveldbjni.internal.NativeOptions.<clinit>(NativeOptions.java:54)
    at .<init>(<console>:9)

顯然,這是此sbt問題頁中記錄的已知問題。 根據eventsourced文檔 ,我已經實現了一個自定義的run-nobootcp命令,該命令在不將Scala庫添加到引導類路徑的情況下執行代碼。

這應該可以解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM