Python&C++
c++调用Python
#include <Python.h>
int main(int argc, char *argv[])
{
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
Py_SetProgramName(program); /* optional but recommended */
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
"print('Today is', ctime(time()))\n");
Py_Finalize();
PyMem_RawFree(program);
return 0;
}
Python调用C++
#include <iostream>
using namespace std;
class TestLib
{
public:
void display(int a);
};
void TestLib::display(int a) {
cout<<"Second display:"<<a<<endl;
}
extern "C" {
TestLib obj;
void display_int() {
obj.display(2);
}
}
把上方的C++源码编译成
libpycallclass.so
,然后通过python的ctypes
库引入。
import ctypes
so = ctypes.cdll.LoadLibrary
lib = so("./libpycallclass.so")
lib.display_int(100)
Java&C++
java 调用C++编写的动态库,可使用JNI 或 Jawin;C++ 调用java ,可以通过JNI。
C++调用Java
JNI提供了这样的接口:GetObjectClass,GetMethodID,CallObjectMethod,NewObject,FindClass。通过这些接口即可完成C/C++对Java接口的调用。
创建虚拟机JVM, 在程序结束的时候销毁虚拟机JVM
寻找class对象
创建class对象的实例
调用方法和修改属性
Java调用C++
把C/C++写成动态链接库;在Java程序在LoadLibrary,利用native接口,即可完成调用。
import Java.com.jni.HelloWorld.HelloWorld
public class Test {
static{
//设置动态库查找路径, 去掉文件扩展名, 去掉 lib前缀
System.loadLibrary("HelloWorld");
}
public static void main(String[] args) {
new HelloWorld().hello();
}
}
声明一个hello函数,用
native
修饰。
package com.jni;
public class HelloWorld {
public native void hello();
}
把java声明编译成cpp头文件,生成
Java_com_jni_HelloWorld.h
javah -classpath <java类路径> -jni Java.jni.HelloWord
定义头文件中生成的函数
#include"Java_com_jni_HelloWorld.h"
JNIEXPORT void JNICALL Java_jni_HelloWorld.HelloWorld.hello
(JNIEnv *env, jobject jobj) {
printf("Hello World!\n");
}
生成动态链接库
libHelloWorld.so
。
gcc -shared Hello.cpp -o HelloWorld.so