python3调用C++

#coding=utf-8
import ctypes
from ctypes import *

lll=ctypes.cdll.LoadLibrary
lib = lll("./libpycall.so")

fun=lib.init
fun.restype = c_int
print(fun(8))
print("*" * 20)

fun=lib.is_inited
fun.restype = c_bool
print(fun())
print("*" * 20)

fun=lib.str2
src = c_char_p()
src.value = "hello world ".encode("utf-8")
dest = "*" * 30
dest = dest.encode('utf-8')
num = fun(src, dest, len(dest))
if num != 0:
    print(dest[:num])
else:
    print("buf is not ok")
print("*" * 20)

print(lib.add(1, 2))
print("*" * 20)
// pycall_so.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class PythonTest{
public:
    PythonTest():_is_inited(false), _num(0){

    }

    int init(int num){
        _num = num;
        _is_inited = true;
        printf("inited ok\n");
        return 0;
    }

    int str2(char *src, char* dest, int len){
        if (src == NULL || len <= 0){
            return 0;
        }

        int src_len = strlen(src);
        int num = snprintf(dest, len, "%s%s", src, src);
        return (num < len -1)? num:0;
    }

    bool is_inited(){
        printf("_num = %d\n", _num);
        return _is_inited;
    }

private:
    bool _is_inited;
    int _num;
};


// pycall.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

class PythonTest{
public:
    PythonTest():_is_inited(false), _num(0){

    }

    int init(int num){
        _num = num;
        _is_inited = true;
        printf("inited ok\n");
        return 0;
    }

    int str2(char *src, char* dest, int len){
        if (src == NULL || len <= 0){
            return 0;
        }

        int src_len = strlen(src);
        int num = snprintf(dest, len, "%s%s", src, src);
        return (num < len -1)? num:0;
    }

    bool is_inited(){
        printf("_num = %d\n", _num);
        return _is_inited;
    }

private:
    bool _is_inited;
    int _num;
};


gcc pycall_so.cpp -shared -fPIC -o libpycall.so
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值