一个使用sbt编译的JNI C++ 的模板
假设你须要在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下载。

一个使用sbt编译的JNI C++ 的模板的更多相关文章
- 【Android】Eclipse自动编译NDK/JNI的三种方法
		
[Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...
 - [转] 用SBT编译Spark的WordCount程序
		
问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? [sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需 ...
 - 使用SBT编译Spark子项目
		
前言 最近为了解决Spark2.1的Bug,对Spark的源码做了不少修改,需要对修改的代码做编译测试,如果编译整个Spark项目快的话,也得半小时左右,所以基本上是改了哪个子项目就单独对那个项目编译 ...
 - sbt编译spark程序提示value toDF is not a member of Seq()
		
sbt编译spark程序提示value toDF is not a member of Seq() 前提 使用Scala编写的Spark程序,在sbt编译打包的时候提示value toDF is no ...
 - window环境下使用sbt编译spark源码
		
前些天用maven编译打包spark,搞得焦头烂额的,各种错误,层出不穷,想想也是醉了,于是乎,换种方式,使用sbt编译,看看人品如何! 首先,从官网spark官网下载spark源码包,解压出来.我这 ...
 - 用SBT编译Spark的WordCount程序
		
问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要 ...
 - 【Android】Eclipse自己主动编译NDK/JNI的三种方法
		
[Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th 2014 Email:skyseraph00@163.com 一.Eclipse关联cy ...
 - Spark-1.0.1 的make-distribution.sh编译、SBT编译、Maven编译 三种编译方法
		
fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3775343.html 本文编译方法所支持的hadoop环境是Hadoop-2.2.0, ...
 - 原已经安装好的nginx,现在需要添加一个未被编译安装的模块--echo-nginx-module-0.56
		
为了测试一个NGINX变量,将NGINX加了一个编译模板echo-nginx-module-0.56. 参照如下文件 1,先看以前NGINX有哪些东东. sbin/nginx -Vnginx vers ...
 
随机推荐
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
			
最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...
 - 3、Android中Activity的跳转
			
1.创建project file->new->android application 依次填入应用名称.project名.包名 在project文件夹下找到src/com. ...
 - adt-bundle-windows加入NDK支持
			
近期换了个硬盘,曾经都是用eclipse安装adt插件的,如今老了,图省事就下载了adt-bundle-windows,解压缩出来就直接用.但是这个adt-bundle没有集成NDK支持,于是手动安装 ...
 - Hive编程指南_学习笔记01
			
第四章: HQl的数据定义 1:创建数据库 create database financials; create database if not exists financials; 2: ...
 - UI组件之TextView及其子类(一)TextView和EditText
			
先来整理一下TexView,EditView的使用方法. Textview是最主要的组件.直接继承了View,也是众多组件的父类.所以了解她的属性会对学习其它组件非常有帮助. TextView的属性: ...
 - oracle 11g not in 与not exists 那个高效?
			
网络上很多谣言是后面跟小表用not in,后面跟大表用not exists,难道真的是这样子的嘛? 情况下面测试: 1.先用小表测试(1000条记录和一张8万条记录的表): SQL> creat ...
 - BZOJ 3165 李超线段树
			
思路: 李超线段树 我是把线段转成斜率的形式搞得 不知道有没有更简单的方法 //By SiriusRen #include <cmath> #include <cstdio> ...
 - Kettle的概念学习系列之Kettle是什么?(一)
			
不多说,直接上干货! Kettle是什么? Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文 ...
 - (转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例
			
Android项目实战(二十八):使用Zxing实现二维码及优化实例 作者:听着music睡 字体:[增加 减小] 类型:转载 时间:2016-11-21我要评论 这篇文章主要介绍了Android项目 ...
 - (转载) Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题
			
Scrollview 嵌套 RecyclerView 及在Android 5.1版本滑动时 惯性消失问题 标签: scrollviewandroid滑动嵌套 2015-07-16 17:24 1112 ...