求助。 Python 使用 ctypes 库调用 C 语言 so 动态库遇到困难。

2020-06-29 11:29:13 +08:00
 GYGYG

最近接到一个需求,要用 python 封装一个 c 语言的 so 。好久没动过 C 语言了。

目前 c 程序调用调通了,代码如下:

#include <stdio.h>
#include "fm_def.h"
#include "fm_cpc_pub.h"


static unsigned char dev_index = 0;
static unsigned int dev_type = 0xE600;
static unsigned int dev_flag = 0x00000002;
static void * dev;


int main()
{
    unsigned int code = FM_CPC_OpenDevice(&dev_index,dev_type,dev_flag,&dev);
    printf("%d\n",code);
}

python 封装这边,用了 ctypes 库调用 so,代码如下:

#!/usr/bin/env python3
from ctypes import *

cur = cdll.LoadLibrary('./libfmapiv100.so')

dev_index = c_ubyte(0)
dev_type = c_uint(0xE600)
dev_flag = c_uint(0x00000002)
dev = c_void_p()

code = cur.FM_CPC_GetDeviceInfo(byref(dev_index), 7, 1, byref(dev))
print(code)

这段代码报错 Segmentation fault,查了下大概率是参数格式问题。 如果参数列表写成

code = cur.FM_CPC_GetDeviceInfo(dev_index, 7, 1, byref(dev))

会返回 errorcode ( so 的错误代码),个人感觉是我第一个参数格式写的有问题。

求救啊!或者有什么别的方案也指导下!多谢!!

1642 次点击
所在节点    Python
4 条回复
Pagliacii
2020-06-29 11:37:30 +08:00
不应该是

```
code = cur.FM_CPC_GetDeviceInfo(byref(dev_index), c_uint(7), c_uint(1), byref(dev))
```

?

通过调用 ctypes 的 c_uint 把 Python 中的数据对象转换成 C 中能识别的数据类型
Pagliacii
2020-06-29 11:40:27 +08:00
还有另一种写法就是声明 FM_CPC_GetDeviceInfo 的 argtypes 和 restype 。https://gist.github.com/Pagliacii/774ed5d3ea78a36cdb0754be6a25408d
GYGYG
2020-06-29 12:00:38 +08:00
@Pagliacii 啊才发现我写错了,这个 7,1 位置是 dev_type,dev_flag 。
我试试这个 argtypes 好了。
感谢。
GYGYG
2020-06-29 18:33:01 +08:00
解决了朋友们,我写错了接口名,导致的一直报错。现在的感受简直想挖个地洞钻进去,浪费了半天时间,系统复习了 C 的指针,算不亏把。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/685556

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX