Scala 程序使用 JNI 技术调用 C++ 程序

Scala 程序使用 JNI 技术调用 C++ 程序,第1张

Scala 程序使用 JNI 技术调用 C++ 程序

scala程序调用C++的方法其实和java调用C++的方法类似,有少许的区别。

1、首先,在 IDEA 中创建 scala 程序,如:实现 scala 程序中 调用 c++ 实现 输入 input ,最后输出 result = input * input。即求一个数的平方。如图所示

class Sample1 {
	// ---  Native methods
	@native def intMethod(n: Int): Int

	def loadLibrary(libName: String): Unit = {
		
		System.loadLibrary(libName)
	}
}

其中:

System.loadLibrary(libName) 里面写的是 生成的 .so/ .dll 的名字

System.load(libName) 里面写的是 生成的 .so/ .dll 的绝对路径和名字,推荐这个。

2、第二步,打开这个程序的文件所在位置

 然后从此处进入 cmd ,输入命令,scalac Sample1.scala

这一步骤的意思是:先将 Sample1.scala 程序生成一个 Sample1.class 文件

然后 输入 javah Sample1,   就会生成相应的  Sample1.h 头文件

3、接下来是实现 Sample1.cpp  ,即对实现 Sample1.h 里面的函数

首先这里是生成的这个 头文件。

#include "jni.h"


#ifndef _Included_Sample1
#define _Included_Sample1
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_Sample1_intMethod
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

然后是 Sample1.cpp

#include "Sample1.h"

JNIEXPORT jint JNICALL Java_Sample1_intMethod
(JNIEnv* env, jobject jobj, jint input) {
	printf("C++:input data: %dn", input);
	jint res = input * input;
	printf("C++:return data: %dn", res);
	return res;
}

4、完成 .cpp 实现后,这里分两种情况:

情况一:你要生成的是 .dll 动态链接库(这是在windows下运行的动态链接库)

情况二:你要生成的是 .so 动态链接库(这是在linux下运行的动态链接库)

情况一的 *** 作:在 vs2019 中

 

实现这几步骤后,点击运行,就会生成 .dll 了

情况二的 *** 作:这一步需要在 linux 系统下完成

首先,在linux 下建一个文件夹,把一些相关文件放进去,如:jni的两个头文件,Sample1.cpp  Sample1.h 即可。

然后命令行输入:

就会生成 libSample1.so 了。 

5、然后就是调用这个动态连接库

还是在 IDEA 程序中:地址就是你的 .dll 或者是 .so 文件的地址,建议用绝对路径

object Sample1 {
	def main(args: Array[String]): Unit = {
		//System.loadLibrary("libSample1.so")
		System.load("/opt/module/spark/spark-standalone/MyProjects/project01/libSample1.so")
		val input = 9
		val sample = new Sample1
		println("java中输入为:" + input)
		val res: Int = sample.intMethod(input)
		println("java中结果为:" + res)
	}
}

6、运行程序:

情况一:在 IDEA 中运行,点击运行即可。

情况二:在linux 下运行,将一些相关文件放入刚才的文件夹中:新放入的只有Sample1.scala

然后就是输入

生成 Sample1.class 和 Sample1$.class

最后执行程序: 

结果为:

7、参考的几篇文章总结的:

scalacpptest: java和scala 代码的jni教程示例,测试调用c/c++native 动态库 (gitee.com)





(1条消息) scala 调用 c++_lxy869735855的博客-CSDN博客

使用scala通过JNI技术调用c++代码 - extendswind - 博客园 (cnblogs.com)

 

在 Apache Spark 中使用 JNI 调用 C/C++ 代码 (icejoywoo.github.io)

8、这是简单的 scala 程序利用 JNI 技术 实现调用 C/C++ 程序的整个步骤。swr

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5606657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存