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

在工作中遇到了这样一种调用方法,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
文件夹结构如下:
![文件夹结构](https://img-blog.csdnimg.cn/20190922194825884.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0R5bGFuXzYyOQ==,size_16,color_FFFFFF,t_70)

第三步,在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
![结果如下](https://img-blog.csdnimg.cn/20190922200036443.png)

好了,三种语言之间的调用过程如上。大家有什么疑问,可以留言讨论。后面也会持续输出一些java相关的文章,喜欢的朋友可以关注一下!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值