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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)