二、Chaquopy:Android调用Python三方库

1,165 阅读1分钟

我正在参加「掘金·启航计划」

一、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 保存绘图后的图像到本地存储器中

最终运行效果

image.png

参考

菜鸟教程Matplotlib Pyplot绘图库

Python中Matplotlib Savefig()使用