ZooRyan 2024-08-06 16:32 采纳率: 80%
浏览 6

异步多线程C++程序通过SWIG转为python

以下C++ SDK异步消息处理程序通过swig封装为python后,运行python进程产生了coredump

// 提供给用户的接口。用户可自定义应答函数的实现
class UserSpi
{
public:
  virtual void OnConnect(){};
  virtual void OnLogin(const std::vector<LoginRsp>& rspList){};
}
// 提供给用户的API,用户通过API连接服务端
class UserApi
{
public:
  static UserApi* CreateApi();
  virtual void Release() = 0;
  virtual void Connect() = 0;
  virtual int RegisterSpi(UserSpi* spi) = 0;
  virtual void Login() = 0;
}

// Callback 为第三方通信库,能与服务端进行异步通信
class Callback
{
  // 建立连接
  virtual void Connect() = 0;
  // 函数返回后 msg 立即被释放
  virtual void OnMsg(Message* msg) = 0;
};
// SDK protobuf消息处理,继承了消息处理库
class Recv : public CS::Callback
{
public:
  virtual void Connect() override
  {
    m_spi->Connect();
  }

  void OnMsg(Message* msg) override
  {
    if (msg->GetUrl == "Login")
    {
        OnLogin(msg, requestId);
    }
  }
  // 异步登录应答处理
  void OnLogin(Message* msg)
  {
    std::vector<LoginRsp> rsp;
    // 解析服务端返回的消息,填充到 rsp 中。此处代码省略。
    
    // 进入OnLogin的python warp函数内产生了空指针,导致coredump
    m_spi->OnLogin(rsp);
  }
private:
  UserSpi* m_spi;
}

调用栈如下:

img

  • 写回答

1条回答 默认 最新

  • 一直免费一直爽 2024-08-11 18:54
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    要解决这个问题,首先确保在编写Python脚本时正确地导入了SWIG库,并且在你的UserApi类中正确地实现了RegisterSpi方法。此外,你需要确保UserSpi类能够正常工作并产生正确的响应。

    下面是一个可能的解决方案:

    1. UserApi类中实现注册UserSpi接口的方法:
    void UserApi::RegisterSpi(UserSpi* spi)
    {
      if (!spi) return;
    
      // 注册接口
      // ...
    }
    
    1. UserSpi类中实现OnConnectOnLogin等方法以处理接收到的异步消息:
    void UserSpi::OnConnect()
    {
      // 实现连接逻辑
      // ...
    }
    
    void UserSpi::OnLogin(const std::vector<LoginRsp>& rspList)
    {
      // 处理登录应答
      // ...
    
      // 发送登录成功响应
      // ...
    }
    
    1. Recv类中实现Connect方法,用于启动SDK连接:
    void Recv::Connect()
    {
      // 开始连接
      // ...
    }
    
    1. 使用SWIG将上述代码转换为Python:
    from pybind11 import cppdef
    
    # 获取SWIG编译器命令
    swig_opts = ['-I/usr/include/pybind11', '-c++']
    
    # 编译SWIG源文件
    cpp_def = cppdef.make_cppdef_from_source('sdk.cpp')
    cpp_def.compile(swig_opts)
    
    # 创建SWIG接口
    cppdef.make_cwrap_interface('sdk', 'sdk.CallBack')
    
    # 打包成Python模块
    cppdef.make_python_module('sdk', ['sdk.py'])
    
    # 导入Python模块
    import sdk
    
    # 调用SDK接口
    sdk.OnConnect()
    sdk.OnLogin([LoginRsp()])
    

    这样,你就可以使用Python脚本来操作这个C++ SDK了。注意,在实际应用中,你需要根据具体的开发环境调整这些步骤和参数。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月6日

悬赏问题

  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播