如果你需要在Scala或是Java中调用C或C++函数库,就需要使用JNI, 这里就涉及到编译scala ,java 和C(C++)代码,在这里给出一个程序的框架,我们使用sbt 缺省的代码目录
文件目录
src
—>main
——–>java
——–>scala
——–>c
其中目录c存放C++代码 ,java目录放置Java代码, scala目录放置Scala代码
项目组用来编译的相关文件为build.sbt 和Makefile (它编译放置在c目录下的C++文件,注意只能编译C++,如果你有需要编译C,需要自行修改Makefile)
修改库文件名为自己所需的名称
修改build.sbt 中的项目名称
3 | version := "0.0.1-SNAPSHOT" |
5 | organization := "com.guidebee" |
修改Makefile的库文件名称
1 | #### PROJECT SETTINGS #### |
2 | # The name of the executable to be created |
4 | BIN_NAME= $(SODIR)/libjnidemo.so |
修改Java引用的库文件名称:
2 | System.loadLibrary("jnidemo"); |
设置环境变量
在你设置好sbt的编译环境后,注意设置 JAVA_HOME 和 LD_LIBRARY_PATH 环境变量 ,Java_HOME为你Java的安装目录, 可以使用
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:./:./target/so
将编译后的库文件添加到 java.library.path 路径中(这样Java代码可以找到库文件所在目录)
编译和运行
编译使用指令 sbt compile
1 | root@ubuntu:/sdb/jni# sbt compile |
2 | [info] Set current project to JNIDemo (in build file:/mnt/sdb1/jni/) |
3 | [info] Compiling 3 Java sources to /mnt/sdb1/jni/target/scala-2.10/classes... |