如何在C++中调用Java代码?

本人所在的项目用的是C++,然而我在写代码的过程中需要使用聚类算法。由于之前使用过Weka(www.cs.waikato.ac.nz/ml/weka)这个机器学习工具包,因此,现在同样希望能够使用这个(C++有个机器学习包叫Shark)。而Weka使用Java写的,其提供一个jar包。

那么问题就来了,如何在C++中调用Java代码呢?

其实很简单,下面是我的RunEM代码,其调用Weka中的EM算法做聚类。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import weka.clusterers.EM;
import weka.core.Instances;
public class RunEM 
{
public static void main(String[] args) throws Exception 
 {
 BufferedReader reader = new BufferedReader(
 new FileReader(args[0]));
 
 Instances data = new Instances(reader);
 
 EM cluster = new EM();
 cluster.setNumClusters(Integer.parseInt(args[1]));
 cluster.buildClusterer(data);
 
 
 PrintWriter writer = new PrintWriter(args[0]+”.result.txt”); 
 for (int i = 0; i < data.numInstances(); ++i)
 {
 int result = cluster.clusterInstance(data.instance(i));
 //System.out.println(result);
 writer.println(result);
 }
 writer.close();
 
 }
}

完成了之后会生成RunEM.class文件,其可以在命令行内用“java RunEM gauss.arff 3”来执行,其中“gauss.arff 3”是两个参数。当然了,由于其调用了weka.jar包,需要在命令行内输入“java -cp weka.jar;. RunEM gauss.arff 3”才能真正的执行。

说了半天,那么在C++代码中怎么调用呢?需要把RunEM.class和你自己电脑中的jdk/bin文件夹拷贝过来,否则会出现找不到java指令的错误,然后在C++代码中加入

system(“.\\bin\\java.exe -cp weka.jar;. RunEM gauss.arff 3”);

就可以啦!是不是很简单!需要注意的是文件的路径。

然后就可以开心地使用Weka啦!

附本人机器环境:

Windows 10 Education, Visual Studio 2015 Community, Java JDK1.8.0_92