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 = {
/* compiled code */
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 里面的函数
首先这里是生成的这个 头文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Sample1 */
#ifndef _Included_Sample1
#define _Included_Sample1
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Sample1
* Method: intMethod
* Signature: (I)I
*/
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: %d\n", input);
jint res = input * input;
printf("C++:return data: %d\n", 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