当前位置: 首页 > news >正文

python 接收c++的.so传的jsoncpp字符串

叮!快来看看我和文心一言的奇妙对话~点击链接 https://yiyan.baidu.com/share/57o6vGa3GY -- 文心一言,既能写文案、读文档,又能绘画聊天、写诗做表,你的全能伙伴!

要从 C++ 动态链接库 (.so 文件) 中接收 JSON 字符串并在 Python 中使用,我们可以使用 jsoncpp 库来生成 JSON 字符串,然后通过 ctypes 库在 Python 中调用 C++ 函数。以下是一个完整的示例,展示如何实现这一过程。

1. 创建 C++ 动态链接库
首先,我们需要创建一个 C++ 动态链接库,该库将生成一个 JSON 字符串并将其返回给 Python。

C++ 代码 (example.cpp)
cpp
#include <string>
#include <json/json.h>
 
extern "C" {
    // 函数返回 JSON 字符串
    const char* get_json_string() {
        Json::Value root;
        root["h"] = 1104;
        root["w"] = 1920;
        root["message"] = "OK";
        root["code"] = 0;
 
        Json::StreamWriterBuilder writer;
        std::string json_str = Json::writeString(writer, root);
 
        // 注意:返回的字符串指针必须在堆上分配,否则会失效
        // 这里我们使用静态变量来保持字符串的生命周期
        static std::string static_json_str;
        static_json_str = json_str;
 
        return static_json_str.c_str();
    }
}
编译为动态链接库
使用以下命令编译 C++ 代码为动态链接库。确保你已经安装了 jsoncpp 库:

bash
g++ -shared -fPIC -std=c++11 example.cpp -o libexample.so -ljsoncpp
2. Python 代码调用动态链接库
接下来,编写 Python 代码来调用这个动态链接库并处理返回的 JSON 字符串。

Python 代码 (main.py)
python
import ctypes
import json
 
def main():
    # 加载动态链接库
    lib = ctypes.CDLL('./libexample.so')
    
    # 指定返回类型为 const char*
    lib.get_json_string.restype = ctypes.c_char_p
    
    # 调用 C++ 函数
    json_str = lib.get_json_string()
    
    # 将 C 字符串转换为 Python 字符串
    json_str = json_str.decode('utf-8')
    
    try:
        # 解析 JSON
        data = json.loads(json_str)
        print("Received data:", data)
        print("Height:", data["h"])
        print("Width:", data["w"])
        print("Message:", data["message"])
        print("Code:", data["code"])
    except json.JSONDecodeError as e:
        print("Error decoding JSON:", e)
 
if __name__ == "__main__":
    main()
3. 运行 Python 代码
确保动态链接库 (libexample.so) 在 Python 可以找到的路径中,然后运行 Python 脚本:

bash
python3 main.py
注意事项
字符串生命周期:在 C++ 中返回字符串时,必须确保字符串的生命周期足够长。在这个例子中,我们使用了一个静态字符串来确保这一点。
JSON 库:确保安装了 jsoncpp 库,并在编译时链接该库。
错误处理:在 Python 中处理 JSON 解析错误和其他可能的异常。
跨平台:这种方法在 Linux 上运行良好。在 Windows 上,你需要使用 .dll 而不是 .so,并且可能需要调整编译命令。
通过这种方式,你可以轻松地在 Python 和 C++ 之间传递 JSON 数据。

http://www.xdnf.cn/news/346789.html

相关文章:

  • springBoot2集成mybatis (手敲学习版)java入门友好
  • 网络原理初识
  • 海外版“咸鱼”——Vinted跨境店铺防封攻略
  • DeepSeek 赋能法律行业:从文书撰写到风险预警的智能实践
  • window 显示驱动开发-处理内存段(一)
  • mysql的访问IP被禁 locked because of many connection errors
  • vue-grid-layout实现拖拽修改工作台布局
  • lumpy:基因组结构变异SV的检测
  • C++代码随想录刷题知识分享-----数组交集—LeetCode 349
  • OpenStack Yoga版安装笔记(26)实例元数据笔记
  • docker mac m1 部署 doris
  • VR制作软件用途(VR制作软件概述)
  • 如何阅读、学习 Git 核心源代码 ?
  • Vue知识框架
  • 为什么用Maple教授微分方程
  • Oracle EBS AP发票被预付款核算创建会计科目时间超长
  • 1688代采系统:技术架构与应用实践
  • mac运行java文件提示 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
  • nginx 配置后端健康检查模块
  • AMO数据集:解决运动模仿偏差的超灵巧人形机器人全身控制混合数据集。
  • 【使用switch结构输出季节】2021-11-23
  • bootstrap入门
  • 15:00面试,15:06就出来了,问的问题有点变态。。。
  • 私服与外挂:刑事法律风险的深度剖析
  • 存储器:DDR和独立显卡的GDDR有什么区别?
  • (十二)深入了解AVFoundation-采集:人脸识别与元数据处理
  • gitee推送更新失败问题记录:remote: error: hook declined to update refs/heads/master
  • 代码随想录第38天:动态规划11(编辑距离)
  • Babylon.js学习之路《一、初识 Babylon.js:什么是 3D 开发与 WebGL 的完美结合?》
  • JavaScript中数组和对象不同遍历方法的顺序规则