我正在参加「掘金·启航计划」
一、Chaquopy官方Demo
1.chaquopy-matplotlib:一个嵌入Python库的简单例子
2.chaquopy-console:Android应用运行Python交互式脚本
3.Electron-Cash:基于Python的Android比特币钱包
4.chaquopy-demo:Chaquopy的PythonSDK Android Demo应用
二、chaquopy-matplotlib解析
Python库安装
python {
pip {
install "matplotlib"
}
}
matplotlib是 Python 的绘图库,需要在build.gradle中添加如下配置,通过pip安装python的库。
Java交互方法
val py = Python.getInstance()
val module = py.getModule("plot")
val bytes = module.callAttr("plot"
,findViewById<EditText>(R.id.etX).text.toString()
,findViewById<EditText>(R.id.etY).text.toString())
.toJava(ByteArray::class.java)
Python.getInstance():获取Python运行环境,映射为Java中的Python;
py.getModule:执行指定的Python文件,映射为Java中的PyObject;
module.callAttr:执行Python文件中指定的方法,并传递参数,返回PyObject对象;
Python与Java数据类型转换
toJava:通过范型原生方法,将Python中的数据类型转变为Java中的数据类型。
import io
import matplotlib.pyplot as plt
def plot(x, y):
xa = [float(word) for word in x.split()]
ya = [float(word) for word in y.split()]
fig, ax = plt.subplots()
ax.plot(xa, ya)
f = io.BytesIO()
plt.savefig(f, format="png")
return f.getvalue()
f.getvalue()通过查看python中的代码,如下图查看f源码库,可以看到,返回的是bytes类型,这里在Java侧则是返回的PyObject对象,然后通过toJava转换数据类型。
Python代码,matplotlib库处理
通过安卓传递的Xx="1 2 3 4",Y,y="1 2 3 4"坐标参数,python切分字符串,并转换为float类型,得到两个X[1.0,2.0,3.0,4.0],Y[1.0,2.0,3.0,4.0]的list数据。
ax.plot(xa, ya)获取 y 中数据与 x 中对应值的二维线图,使用默认样式
io.BytesIO创建内存中的二进制流
plt.savefig 保存绘图后的图像到本地存储器中
最终运行效果