假设你须要在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 中的项目名称

1 name := "JNIDemo"
2  
3 version := "0.0.1-SNAPSHOT"
4  
5 organization := "com.guidebee"

改动Makefile的库文件名称称

1 #### PROJECT SETTINGS ####
2 # The name of the executable to be created
3 SODIR = target/so
4 BIN_NAME= $(SODIR)/libjnidemo.so

改动Java引用的库文件名称称:

1 static {
2     System.loadLibrary("jnidemo");
3   }

环境变量设置
在你设置好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...
4 Creating directories
5 Beginning release build
6 Compiling: src/main/c/IntArray.cpp -> build/release/IntArray.o -Wall -Wextra -g -fPIC -c -O -m64 -Wunused-parameter
7 src/main/c/IntArray.cpp:21:1: warning: unused parameter ‘obj’ [-Wunused-parameter]
8  Java_IntArray_sumArray(JNIEnv *env, jobject obj, jintArray arr)
9  ^
10          Compile time: 00:00:00
11 Compiling: src/main/c/Prompt.cpp -> build/release/Prompt.o -Wall -Wextra -g -fPIC -c -O -m64 -Wunused-parameter
12 src/main/c/Prompt.cpp: In function ‘_jstring* Java_Prompt_getLine(JNIEnv*, jobject, jstring)’:
13 src/main/c/Prompt.cpp:24:13: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
14    char *buf="hello";
15              ^
16 src/main/c/Prompt.cpp: At global scope:
17 src/main/c/Prompt.cpp:22:1: warning: unused parameter ‘obj’ [-Wunused-parameter]
18  Java_Prompt_getLine(JNIEnv *env, jobject obj, jstring prompt)
19  ^
20          Compile time: 00:00:00
21 mkdir target/so
22 Linking: target/so/libjnidemo.so
23 #@g++ build/release/IntArray.o build/release/Prompt.o  -fPIC    -o target/so/libjnidemo.so
24          Link time: 00:00:00
25 Making library: target/so/libjnidemo.so -> target/so/libjnidemo.so
26 Total build time: 00:00:00
27 [success] Total time: 1 s, completed 29/08/2014 10:10:19 PM

执行
sbt run

1 root@ubuntu:/sdb/jni# sbt run
2 [info] Set current project to JNIDemo (in build file:/mnt/sdb1/jni/)
3 [info] Running Test
4 [info] User typed: hello
5 [info] sum = 45
6 [info] Type a line:
7 [success] Total time: 0 s, completed 29/08/2014 10:10:54 PM

删除编译结果
sbt clean

1 root@ubuntu:/sdb/jni# sbt clean
2 [info] Set current project to JNIDemo (in build file:/mnt/sdb1/jni/)
3 [info] Updating {file:/mnt/sdb1/jni/}jni...
4 [info] Resolving org.fusesource.jansi#jansi;1.4 ...
5 [info] Done updating.
6 Deleting target/so/libjnidemo.so symlink
7 Deleting directories
8 [success] Total time: 1 s, completed 29/08/2014 10:11:35 PM

Github 代码
本例模板代码能够在 https://github.com/guidebee/JNIDemo下载。

 

最新文章

  1. over partition by与group by 的区别
  2. android如何播放和录制音频
  3. HDU 5510 Bazinga (字符串匹配)
  4. boxplot
  5. hdu 4764 Stone (巴什博弈,披着狼皮的羊,小样,以为换了身皮就不认识啦)
  6. 笨笨-歌词伴侣V1.2(酷狗KRC转LRC,LRC歌词批量下载)
  7. C#中的 ref 传进出的到底是什么 解惑篇
  8. A version is required for an API group definition.
  9. PHP和MYSQL的编码问题
  10. SQL window身份登陆 SQL server不能登陆
  11. PHP 5 数据类型
  12. UIWebView 跳过HTTPS证书认证
  13. 学习日记之工厂方法模式和Effective C++
  14. MongoDB的DBREF 使用.
  15. Python自学知识点----Day01
  16. java多线程之堵塞的应用
  17. 深入理解跨域SSO(单点登录)原理与技术
  18. linux随机生成密码
  19. Mac 系统重新安装的几种方法
  20. PHP有关守护进程,以及流程控制和信号处理函数

热门文章

  1. Nutch2 WebPage 字段解释
  2. WinServer-IIS-请求筛选
  3. Android自己定义百度地图缩放图标
  4. 在IDEA中代码自动提示第一个字母大小写必须匹配的解决
  5. java之IO处理
  6. Spoj 1557 Can you answer these queries II 线段树 随意区间最大子段和 不反复数字
  7. 第二次phython作业
  8. BZOJ 1007: [HNOI2008]水平可见直线 平面直线
  9. js解析网络中的json数据
  10. js捕获页面回车事件