java 调用c++, c++调用python

1,445 阅读2分钟

在工作中遇到了这样一种调用方法,java中调用c++,c++调用python,这种调用方法还是比较麻烦的。今天给大家大概介绍一下。本文重点介绍流程,大家重点关注流程。 首先写一个python脚本,文件名叫myprint.py, 内容如下: def say(word): print(word) return "hello"

第二,写java代码生成c++头文件。 创建test文件夹,在该文件夹下创建一个文件叫Test.java,内容如下: package test; public class Test{ static{ System.loadLibrary("test"); //加载一个c++动态库名字叫test,windows下叫test.dll即可,linux要生成一个libtest.so的动态库。 }

public native int test(String word);
public static void main(String[] args){
	Test t = new Test();
	int a = t.test("this is a test");
	System.out.println(a);
}

} 生成c++头文件,本文测试环境java版本是java10,由于此版本不支持javah命令,因此我们用javac -h代替。在test文件夹同级目录执行如下命令: javac -h . ./test/Test.java 文件夹结构如下:

文件夹结构

第三步,在vs下创建dll工程,此处不详细介绍了,如果有不清楚的同学,可以百度,较为简单。注意此工程要生成一个叫test.dll的动态库。 在该工程中创建一个文件叫test.cpp的文件,内容如下:

#include "stdafx.h"
#include "Header.h"
#include "Python.h"
#include <iostream>
#include <stdlib.h>
#include "test_Test.h"
using namespace std;

int test(string word){
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('D:/python_test/')");//注意此处写你的python脚本所在目录
PyObject* pModule = PyImport_ImportModule("myprint");//此处写你的python脚本的模块名
if (!pModule) // 加载模块失败
{
	cout << "[ERROR] Python get module failed." << endl;
	char c;
	cin >> c;
	return 0;
}
cout << "[INFO] Python get module succeed." << endl;
PyObject* pv = PyObject_GetAttrString(pModule, "say");
if (!pv || !PyCallable_Check(pv))  // 验证是否加载成功
{
	cout << "[ERROR] Can't find funftion (test_add)" << endl;
	return 0;
}
cout << "[INFO] Get function (test_add) succeed." << endl;

PyObject* args = PyTuple_New(1);
const char *r = "this is a test";
PyTuple_SetItem(args, 0, Py_BuildValue("s", r));

PyObject *pReturn = PyEval_CallObject(pv, args);
Py_Finalize();
char test;
cin >> test;
return 0;
}


JNIEXPORT jint JNICALL Java_test_Test_test
(JNIEnv * env, jobject obj, jstring j_name){
	string c_name = env->GetStringUTFChars(j_name, NULL);
	int res = test(c_name);
	return res;
}

然后我们去test文件夹同级目录下去执行java命令即可。 java test/Test

结果如下

好了,三种语言之间的调用过程如上。大家有什么疑问,可以留言讨论。后面也会持续输出一些java相关的文章,喜欢的朋友可以关注一下!