假设你须要在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++ 的模板的更多相关文章

  1. 【Android】Eclipse自动编译NDK/JNI的三种方法

    [Android]Eclipse自动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 更多精彩请直接访问SkySer ...

  2. [转] 用SBT编译Spark的WordCount程序

    问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? [sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需 ...

  3. 使用SBT编译Spark子项目

    前言 最近为了解决Spark2.1的Bug,对Spark的源码做了不少修改,需要对修改的代码做编译测试,如果编译整个Spark项目快的话,也得半小时左右,所以基本上是改了哪个子项目就单独对那个项目编译 ...

  4. 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 ...

  5. window环境下使用sbt编译spark源码

    前些天用maven编译打包spark,搞得焦头烂额的,各种错误,层出不穷,想想也是醉了,于是乎,换种方式,使用sbt编译,看看人品如何! 首先,从官网spark官网下载spark源码包,解压出来.我这 ...

  6. 用SBT编译Spark的WordCount程序

    问题导读: 1.什么是sbt? 2.sbt项目环境如何建立? 3.如何使用sbt编译打包scala? sbt介绍 sbt是一个代码编译工具,是scala界的mvn,可以编译scala,java等,需要 ...

  7. 【Android】Eclipse自己主动编译NDK/JNI的三种方法

    [Android]Eclipse自己主动编译NDK/JNI的三种方法 SkySeraph Sep. 18th  2014 Email:skyseraph00@163.com 一.Eclipse关联cy ...

  8. Spark-1.0.1 的make-distribution.sh编译、SBT编译、Maven编译 三种编译方法

    fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3775343.html 本文编译方法所支持的hadoop环境是Hadoop-2.2.0, ...

  9. 原已经安装好的nginx,现在需要添加一个未被编译安装的模块--echo-nginx-module-0.56

    为了测试一个NGINX变量,将NGINX加了一个编译模板echo-nginx-module-0.56. 参照如下文件 1,先看以前NGINX有哪些东东. sbin/nginx -Vnginx vers ...

随机推荐

  1. input输入框获取焦点是背景黄色去除

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset !important;}

  2. ASP.NET-Session cooike

    Application .Cookie和 Session 两种会话有什么不同 答:Application是用来存取整个网站全局的信息,而Session是用来存取与具体某个访问者关联的信息, Sessi ...

  3. IntelliJ IDEA 初始化项目时No Java SDK Found

    IntelliJ IDEA 初始化项目时No Java SDK Found 自己在Project SDK后面的New按钮进行JDK的添加:

  4. iOS-UIImage imageWithContentsOfFile 和 imageName 对照

    1.imageWithContentsOfFile NSString *imagePath = [NSString stringWithFormat:@"%@/%@",[[NSBu ...

  5. hibernate配置数据库连接池三种用法

    三种连接都是以连接MySQl为例. <!-- JDBC驱动程序 --> <property name="connection.driver_class">o ...

  6. Ubuntu: GlusterFS+HBase安装教程

    HBase通常安装在Hadoop HDFS上,但也能够安装在其它实现了Hadoop文件接口的分布式文件系统上.如KFS. glusterfs是一个集群文件系统可扩展到几peta-bytes. 它集合了 ...

  7. 【MongoDB】深入了解MongoDB不可不知的十点

    一.对象ID的生成 每一个mongoDB文档那个都要求有一个主键.它在每一个集合中对全部的文档必须是唯一的.主键存放在文档_id字段中.由12个字符组成: 4c291856       238d3b  ...

  8. C#中的CSP(Communicating sequential processes)

    说起Golang(后面统称为Go),就想到他的高并发特性,在深入一些就是 Goroutine.在大家被它优雅的语法和简洁的代码实现的高并发程序所折服时,其实C#/.NET也可以很容易的做到.今天我们来 ...

  9. ServiceStack.Redis之IRedisClient<第三篇>【转】

    事实上,IRedisClient里面的很多方法,其实就是Redis的命令名.只要对Redis的命令熟悉一点就能够非常快速地理解和掌握这些方法,趁着现在对Redis不是特别了解,我也对着命令来了解一下这 ...

  10. Spring mvc <mvc:resources ***/> 作用

    <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd --> 如在页面需要导入其它 ...