scala代码编写

Sample1.scala

class Sample1 {
// --- Native methods
@native def intMethod(n: Int): Int
def loadLibrary(libName:String):Unit = {
System.loadLibrary(libName)
}
} intMethod输入一个int类型的数,返回输入数的平方 loadLibrary函数用于载入.so文件,在类外的调用有时会出问题

编译scala文件并生成.h文件

scalac Sample1.scala
export SCALA_LIB_HOME=/home/hadoop/scala-2.11.8/lib/
export SCALA_CP=$SCALA_LIB_HOME/scala-library.jar:$SCALA_LIB_HOME/scala-refl ect.jar
javah -cp $SCALA_CP:. Sample1

编写.h文件对应的cpp文件,并编译

#include "Sample1.h"

/*
* Method: intMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_Sample1_intMethod
(JNIEnv *, jobject, jint int_t)
{
return int_t*int_t;
}
g++ -dynamiclib -fPIC -shared -O3 -I /usr/include -I $JAVA_HOME/include -I $JAVA_HOME/include/linux Sample1.cpp -o libSample1.so

此处还可以使用cmake进行整理编译

直接scala shell下调用

运行命令进入shell

scala -Djava.library.path=[/path/to/lib*.so]

然后命令行输入调用

var s1 = new Sample1
s1.loadLibrary("Sample1")
s1.intMethod(5)

还可以编写scala文件调用,过程类似

object run{
def main(args: Array[String]) {
System.loadLibrary("Sample1")
var ss = new Sample1
println(ss.intMethod(5))
}
}

编译运行scala文件,需要指定c++动态链接库的路径

scalac run.scala
scala -Djava.library.path=/home/hadoop/project/jni_tmp run

此处大坑预警!!

很郁闷的问题,之前在使用以下命令在scala shell直接调用Sample1的类时,报链接错误且没有理由

   System.loadLibrary("Sample1")
var ss = new Sample1
println(ss.intMethod(5))

错误 java.lang.UnsatisfiedLinkError: Sample1.intMethod(I)

在google时发现有人提到:“System.loadLibrary("Sample1")的调用层次应该与Sample1类的载入保持一致”。没有深究调用层次的问题,和JVM调用机制有关。将System.loadLibrary函数换到类中调用后没有此问题。

ps:baidu、bing下搜了一大堆完全没答案,技术问题还得靠google。

参考 http://blog.csdn.net/funy88/article/details/44646601

使用scala通过JNI技术调用c++代码的更多相关文章

  1. JNI Java调用C代码 示例

    Activity public class MainActivity extends ListActivity {     static {         System.loadLibrary(&q ...

  2. 11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方式。

    <span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</s ...

  3. JAVA用JNI方法调用C代码实现HelloWorld

    一.首先是java运行环境的搭建,到官网下载java jdk安装即可(注意要修改环境变量).还可以顺便安装eclipse. 二.编写java代码,文件名HelloWorld.java public c ...

  4. 【转】Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    原文网址:http://cherishlc.iteye.com/blog/1756762 在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在And ...

  5. [转][android][利用JNI技术在Android中调用、调试C++代码]

    在Android中调用C++其实就是在Java中调用C++代码,只是在windows下编译生成DLL,在Android中会生成Linux系统下的.so文件(好吧,其实我基本没用过Linux). 没写过 ...

  6. windows和linux环境下java调用C++代码-JNI技术

    最近部门做安卓移动开发的需要调C++的代码,困难重重,最后任务交给了我,查找相关资料,没有一个教程能把不同环境(windows,linux)下怎么调用说明白的,自己在实现的过程中踩了几个坑,在这里总结 ...

  7. JNI技术基础(2)——从零开始编写JNI代码

    书接上文: <JNI技术基础(1)——从零开始编写JNI代码> 2.编译源程序HelloWorld.java并生成HelloWorld.class 3.生成头文件HelloWorld.h ...

  8. JNI技术基础(1)——从零开始编写JNI代码

    众所周知,Java程序的最大特点就是其跨平台的特性,编写的上层应用程序可以不加任何修改甚至不用重新编译而运行于不同的平台上,然而,Java本身也存着这一个弊端,那就是性能上相对要差一些,在对性能要求比 ...

  9. 通过JNI实现java调用C代码和C代码调用java的代码

    一.java调用C代码 1)java中需要声明调用的函数,也就是native方法,并通过System.LoadLibrary来调用dll或者so(C代码).实例代码如下: public class H ...

随机推荐

  1. flutter从入门到精通一

    Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台 flutter是基于dart语言开发的,我们将首先通过几章节 ...

  2. jmeter中生成UUID作为唯一标识符

    在测试过程中,我们有时候需要一个唯一不重复的值(比如order_id).我之前一直用的时间戳+计数器/随机函数拼接,但是有时候效果不太好,今天知道了UUID这玩意,可以来操作下.jmeter也提供了U ...

  3. 解决:error LNK1169: 找到一个或多个多重定义的符号

    每一个c++项目中可以包含多个cpp文件和.h文件,不过只能有而且必须有一个cpp文件中包含main函数,否则就会报错.所以在一个c++项目中不能单独运行一个cpp文件,只能运行一个项目.如果你想一个 ...

  4. WSL 服务自动启动

    WSL 服务自动启动 参考 https://zhuanlan.zhihu.com/p/47733615 Windows 启用 WSL 功能支持 > Enable-WindowsOptionalF ...

  5. iOS - 反射机制: objc_property_t的使用

    iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值.(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性.) 常用的反射方式,有如下 ...

  6. 哈夫曼树详解——PHP代码实现

    在介绍哈夫曼树之前需要先了解一些专业术语 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L ...

  7. Java程序员的自我修养

    一.自我修养路线图 如图,这是笔者所走的路.且不论这路走的对不对,这个过程中行业环境会影响到你,大可不必钻牛角尖.附上这张图的目的是为了说,如果你想成为一个优秀的程序员,那么你一定要有规划.当然,别想 ...

  8. 1 spring如何通过组件扫描和自动装配实现自动化的配置

    1 首先将spring依赖的包全部导入 2 建立测试接口 public interface CompactDisc { void play(); } 3 具体的类实现接口 import org.spr ...

  9. bootstrap-table分页

    首先引用css: <link rel="stylesheet" type="text/css" href="css/bootstrap.css& ...

  10. Spark学习笔记3——RDD(下)

    目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...