【跨语言调用-2】

本文介绍了如何在C++中调用Python代码,使用Python的ctypes库调用C++动态库,以及Java通过JNI调用C++和C++调用Java的方法。详细步骤包括编译、加载库以及调用具体函数,展示了不同编程语言间的无缝协作。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值