一个使用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 ...
随机推荐
- oracle查询表空间的位置
SELECT * FROM Dba_Data_Files ddf WHERE ddf.tablespace_name = 'TablespaceName'; 以上SQL代码可以查询出表空间的所在路径和 ...
- mybatis中根据日期模糊查询
首先设置起始日期startDate和结束日期endDate,数据库中日期字段为achive_time,表名为dos_dossier<select id="getDossiers&quo ...
- Android动态加载字节码
概述 面对App业务逻辑的频繁变更,如果每一次改变都对App进行一次升级,会降低App的用户体验,那么App进行模块化升级(这里与增量升级是不同的)是很好的解决方案,让用户在完全无感觉的情况下改变Ap ...
- Loopback測试软件AX1用户手冊 V3.1
点击:AX1 软件下载 1. 什么是AX1 AX1程序是基于windows的PC程序,用来评估 iinChip™的性能,也即是wiznet的硬件TCP/IP芯片. AX1通过网络与iinChip™评估 ...
- 一分钟了解Android横竖屏 mdpi hdpi xhdpi xxhdpi xxxhdpi
DPI:每英寸像素数 简单的屏幕分辨率计算方法: DisplayMetrics metrics = this.getResources().getDisplayMetrics(); float den ...
- 编写shell脚本获取本机的网络地址。  比方:本机的ip地址是:192.168.100.2/255.255.255.0,那么它的网络地址是 192.168.100.1/255.255.255.
ubuntu@ubuntu:~$ vim getlocalip.sh #!/bin/bash #ifconfig | grep inet | awk '$2' | awk -F : '$2' IP=` ...
- bzoj1019: [SHOI2008]汉诺塔(动态规划)
1019: [SHOI2008]汉诺塔 题目:传送门 简要题意: 和经典的汉诺塔问题区别不大,但是题目规定了一个移动时的优先级: 如果当前要从A柱子移动,但是A到C的优先级比A到B的优先级大的话,那就 ...
- rsync来传输文件(可断点续传)
scp传文件的话如果出错就得重新来过, 用rsync可以实现断点上传的功能 大概就是这样用: rsync -P --rsh=ssh home.tar 192.168.205.34:/home/h ...
- 计算label
func getCGSize(size:CGSize,fontSize:CGFloat,text:String)->CGSize{ let attributes = [NSFontAttribu ...
- HD-ACM算法专攻系列(11)——Exponentiation
问题描述: 源码: 考察对大数的计算,需要注意去除前导0与后导0. import java.math.BigDecimal; import java.util.*; public class Main ...