qpython调用c语言代码之传参
qpython吧
全部回复
仅看楼主
level 5
KnIfER 楼主
接上贴得到hello_world.so之后。
现展示手机上用qpython调用形如main(int argc,char *argv[])的带array的函数.
原来我想的简单,比如dl.main(3,[“参数1”,“参数2”,“参数3”]),结果发现segmentation报错。
#coding=utf8
from ctypes import *
f = open("/data/user/0/org.qpython.qpy/files/abc.txt","w")
frompath="/storage/emulated/0/hello_world.so"
topath="/data/user/0/org.qpython.qpy/files/lib/hello_world.so"
import os
os.system('cp '+frompath+' '+topath)
dl=CDLL(topath)
dl.main.argtypes=(c_int,POINTER(c_char_p))
p=POINTER(c_char_p)(c_char_p("ajsi"))
p[0]=c_char_p("参数0")
p[1]=c_char_p("参数1")
p[2]=c_char_p("参数3")
print dl.main(3,p)
1.保存代码为runHelloworld.py
2.将hello_world.so复制到sd卡根目录/storage/emulated/0/
3.运行runHelloworld.py
值得一提的是传参过程
dl.main.argtypes=(c_int,POINTER(c_char_p))
p=POINTER(c_char_p)(c_char_p("..."))
这语法也是醉了。。
2017年07月09日 10点07分 1
level 5
KnIfER 楼主
python中使用ctypes调用动态库.so或.dll里的c代码时,要指定参数类型argtypes。
ctypes定义了一些常用数据类型,比如c_int,c_char_p。
POINTER(c_char_p)的意思是定义了指向c_char_p指针的指针类型,大概相当于char **
c_char_p("...")的意思是新建一个char *指针,指向数据"..."
p=POINTER(c_char_p)(c_char_p("ajsi"))这句话。。。p的类型是POINTER(c_char_p),我们用c_char_p("ajsi")来实例化它。
有关ctypes详见链接一
参见passing arrays with ctypes链接二
2017年07月09日 10点07分 2
2017年07月09日 10点07分
库文件和脚本代码:度盘1pKKq8XH密码oq5m
2017年07月09日 10点07分
level 5
KnIfER 楼主
撒花~我的下下个帖子将是关于qpython调用执行ffmpeg命令行工具!
比如:dl.main(1,"ffmpeg -i sdcrard/123.mp4")
先去c4droid把装**平复一下心情。。
2017年07月09日 10点07分 3
1