码迷,mamicode.com
首页 > 编程语言 > 详细

一个使用sbt编译的JNI C++ 的模板

时间:2014-09-01 12:41:43      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:des   style   http   color   os   io   使用   java   ar   

如果你需要在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 中的项目名称

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

修改Makefile的库文件名称

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

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

1static {
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

1root@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...
4Creating directories
5Beginning release build
6Compiling: src/main/c/IntArray.cpp -> build/release/IntArray.o -Wall -Wextra -g -fPIC -c -O -m64 -Wunused-parameter
7src/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
11Compiling: src/main/c/Prompt.cpp -> build/release/Prompt.o -Wall -Wextra -g -fPIC -c -O -m64 -Wunused-parameter
12src/main/c/Prompt.cpp: In function ‘_jstring* Java_Prompt_getLine(JNIEnv*, jobject, jstring)’:
13src/main/c/Prompt.cpp:24:13: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
14   char *buf="hello";
15             ^
16src/main/c/Prompt.cpp: At global scope:
17src/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
21mkdir target/so
22Linking: 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
25Making library: target/so/libjnidemo.so -> target/so/libjnidemo.so
26Total build time: 00:00:00
27[success] Total time: 1 s, completed 29/08/2014 10:10:19 PM

运行
sbt run

1root@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

1root@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.
6Deleting target/so/libjnidemo.so symlink
7Deleting directories
8[success] Total time: 1 s, completed 29/08/2014 10:11:35 PM

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

bubuko.com,布布扣

 

一个使用sbt编译的JNI C++ 的模板

标签:des   style   http   color   os   io   使用   java   ar   

原文地址:http://blog.csdn.net/mapdigit/article/details/38977127

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!