Scala SBT and JNI library -


i writing simple app in scala uses leveldb database through leveldbjni library. build.sbt file looks this:

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" ) 

an object responsible creating database. unfortunately if run program java.lang.unsatisfiedlinkerror, raised hawtjni library leveldbjni exploits under hood.

the error can triggered scala console:

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     @ org.fusesource.leveldbjni.internal.nativeoptions.init(native method)     @ org.fusesource.leveldbjni.internal.nativeoptions.<clinit>(nativeoptions.java:54)     @ org.fusesource.leveldbjni.jnidbfactory$optionsresourceholder.init(jnidbfactory.java:98)     @ org.fusesource.leveldbjni.jnidbfactory.open(jnidbfactory.java:167)     @ .<init>(<console>:15) ... scala> system getproperty "java.io.tmpdir" res2: string = /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/t/ 

i can't understand going on since library getting correctly extracted jar file not getting loaded reasons.

$ file /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/t/lib* /var/folders/1l/wj6yg_wd15sg_gcql001wchm0000gn/t/libleveldbjni-1.7.jnilib:    mach-o universal binary 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 

i think problem related classloader sbt employs not sure since relatively new scala.

update

still didn't find or culprit. anyway library found , correctly loaded, since can execute following commands:

scalac> import org.fusesource.leveldbjni.internal.nativedb scalac> nativedb.library.load() 

the error somehow due init() function according hawtjni documentation responsible setting all static fields annotated constant fields constant value. exception can still triggered typing:

scalac> import org.fusesource.leveldbjni.internal.nativeoptions scalac> new nativeoptions() java.lang.unsatisfiedlinkerror: org.fusesource.leveldbjni.internal.nativeoptions.init()v     @ org.fusesource.leveldbjni.internal.nativeoptions.init(native method)     @ org.fusesource.leveldbjni.internal.nativeoptions.<clinit>(nativeoptions.java:54)     @ .<init>(<console>:9) 

apparently known problem documented in sbt issue page. have implemented, according eventsourced documentation, custom run-nobootcp command executes code without adding scala library boot classpath.

this should solve problem.


Comments