使用 ctypes 将结构传递给本机库时出现问题
Trouble with passing struct to native library with ctypes
我在Python 2.7中第一次使用ctypes时遇到了一点麻烦。问题如下:
- 我在本机代码中调用一个函数来给我一些内存。该函数为我提供了一个指向缓冲区的指针。在继续操作之前,缓冲区将强制转换为 ctypes 结构。
- 我分配了一些结构成员,并执行了内存移动来填充我需要的字段。
- 指向缓冲区的指针将传递到库中的另一个函数。
问题是另一个函数没有看到我在 Python 中所做的任何更改。我在 Python 解释器上使用 gdb 确认了这一点。基本上,我执行的所有操作似乎都没有任何效果,我期望设置的字段为零或不包含任何数据。
以下是与库交互的 Python 代码:
pxCspPacket = ctypes.cast(
pycsp.csp_buffer_get(bytesToSend),
ctypes.POINTER(pycsp.csp_packet_t))
pxCspPacket.contents.length = bytesToSend
ctypes.memmove(pxCspPacket.contents.data,
dataToSend,
bytesToSend)
# Send packet
pycsp.csp_send(conn, pxCspPacket, self.cspTimeout)
库的绑定如下所示:
class csp_packet_t (ctypes.Structure):
_pack_ = 1
_fields_ = [("padding", ctypes.c_uint8 * 46),
("length", ctypes.c_uint16),
("id", csp_id_t),
("data", ctypes.c_uint8 * 256)]
C 中结构的相应定义:
typedef struct __attribute__((__packed__)) {
uint8_t padding[CSP_PADDING_BYTES];
uint16_t length;
csp_id_t id;
union {
uint8_t data[0];
uint16_t data16[0];
uint32_t data32[0];
};
} csp_packet_t;
提前感谢任何帮助!
我发现了这个问题,这与我使用 ctypes 的方式无关。事实证明,C 中结构的定义与我的 python 绑定不同 - CSP_PADDING_BYTES在本机库中定义为 8 个字节,而 Python 绑定中的填充设置为 46 个字节。
绑定和结构定义不是我自己的代码,但至少我知道如何修复它!
相关文章:
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- VC++本机单元测试,找不到调试符号
- 在这种情况下,java对象是否可以调用本机函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 无法将标准库导入本机 android 项目中的头文件
- 使用本机 C++ 应用程序中的 C# 代码
- 在nodejs中使用本机代码的最佳方法是什么?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 我在 Mac 的 Electron 中的本机C++插件有问题
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- 通过JNI执行OpenCV本机函数的问题
- 从多线程.net应用程序调用的本机dll中的tbb存在问题
- 将BSTR从本机c++传递到托管c#dll时出现问题
- 视力的NET C#调用C++本机Win32 DLL时出现问题
- GraphicsMagick使用c++java本机代码的性能问题
- 为什么 fopen 由于来自 Android-NDK 应用程序的权限问题而在本机方法中失败
- Java本机接口(JNI)是否受到c++ ABI兼容性问题的影响
- 本机C++dll/C#内存问题