当前位置:   article > 正文

Python 学习笔记 —— 使用Chaquopy在AndroidStudio添加Python环境,java和python互调_debug: chaquopy requires ndk.abifilters: you may w

debug: chaquopy requires ndk.abifilters: you may want to add it to defaultco

序言

使用的是Chaquopy官网: https://chaquo.com/chaquopy/

下载最新版Android Studio

我目前下的是Android Studio 3.5 (https://developer.android.google.cn/studio/)

另附:
配置Android Studio的缓存文件路径(释放你的C盘)
https://blog.csdn.net/soonfly/article/details/77933786

新建Android工程

minSdkVersion must be at least 16.
(android SDK 版本16以上)
Android Gradle plugin version should be between 3.1 and 3.5
(Android Gradle 版本3.1-3.5)

配置python环境

在工程目录下的build.gradle里添加如下:

buildscript {
    repositories {
        ...
        maven { url "https://chaquo.com/maven" } //添加行
    }
    dependencies {
        ...
        classpath "com.chaquo.python:gradle:6.3.0" //添加行
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述
在app目录下的build.gradle添加:
使用插件:

apply plugin: 'com.chaquo.python' //添加行
  • 1

指定NDK:

ndk {
            // 指定abi,如需在模拟器调试,增加"x86",否则指定"armeabi-v7a"即可
            abiFilters "armeabi-v7a", "x86"
    }
  • 1
  • 2
  • 3
  • 4

Python路径:
(如果没有安装python,可参照我另一篇文档中的python安装方式https://blog.csdn.net/wwb1990/article/details/103883775

python {
            // 指定python路径
            buildPython "F:/IDE/Anaconda3/envs/py36/python.exe"
        }
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
配置好上面的两个gradle文件之后,同步一下
在这里插入图片描述
成功之后如下图
在这里插入图片描述
并且在src/main的目录下可以看到,新加的python文件夹
在这里插入图片描述
安装python文件编辑工具:
点击File -> setting 到设置界面,点击plugin,搜索python
在这里插入图片描述
安装成功之后,按钮会变为重启android studio
在这里插入图片描述
点击重启即可。

测试代码

在python文件夹上点击右键,新建python文件
在这里插入图片描述
新建hello.py
在这里插入图片描述
之后在hello.py中添加代码:
(其中com.wwb.test.python.JavaBean改为自己的包名和class名)

from java import jclass

def greet(name):
    print("--- hello,%s ---" % name)

def add(a,b):
    return a + b

def sub(count,a=0,b=0,c=0):
    return count - a - b -c

def get_list(a,b,c,d):
    return [a,b,c,d]

def print_list(data):
    print(type(data))
    # 遍历Java的ArrayList对象
    for i in range(data.size()):
        print(data.get(i))

# python调用Java类
def get_java_bean():
    JavaBean = jclass("com.wwb.test.python.JavaBean")#用自己的包名
    jb = JavaBean("python")
    jb.setData("json")
    jb.setData("xml")
    jb.setData("xhtml")
    return jb
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

修改MainActivity.java,代码如下:

package com.wwb.test.python;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import com.chaquo.python.Kwarg;
import com.chaquo.python.PyObject;
import com.chaquo.python.android.AndroidPlatform;
import com.chaquo.python.Python;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    static final String TAG = "PythonOnAndroid";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initPython();
        callPythonCode();
    }
    // 初始化Python环境
    void initPython(){
        if (! Python.isStarted()) {
            Python.start(new AndroidPlatform(this));
        }
    }
    // 调用python代码
    void callPythonCode(){
        Python py = Python.getInstance();
        // 调用hello.py模块中的greet函数,并传一个参数
        // 等价用法:py.getModule("hello").get("greet").call("Android");
        py.getModule("hello").callAttr("greet", "Android");

        // 调用python内建函数help(),输出了帮助信息
        py.getBuiltins().get("help").call();

        PyObject obj1 = py.getModule("hello").callAttr("add", 2,3);
        // 将Python返回值换为Java中的Integer类型
        Integer sum = obj1.toJava(Integer.class);
        Log.d(TAG,"add = "+sum.toString());

        // 调用python函数,命名式传参,等同 sub(10,b=1,c=3)
        PyObject obj2 = py.getModule("hello").callAttr("sub", 10,new Kwarg("b", 1), new Kwarg("c", 3));
        Integer result = obj2.toJava(Integer.class);
        Log.d(TAG,"sub = "+result.toString());

        // 调用Python函数,将返回的Python中的list转为Java的list
        PyObject obj3 = py.getModule("hello").callAttr("get_list", 10,"xx",5.6,'c');
        List<PyObject> pyList = obj3.asList();
        Log.d(TAG,"get_list = "+pyList.toString());

        // 将Java的ArrayList对象传入Python中使用
        List<PyObject> params = new ArrayList<PyObject>();
        params.add(PyObject.fromJava("alex"));
        params.add(PyObject.fromJava("bruce"));
        py.getModule("hello").callAttr("print_list", params);

        // Python中调用Java类
        PyObject obj4 = py.getModule("hello").callAttr("get_java_bean");
        JavaBean data = obj4.toJava(JavaBean.class);
        data.print();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

新建java类JavaBean,用于python回调java

package com.wwb.test.python;

import android.util.Log;
import java.util.ArrayList;
import java.util.List;

public class JavaBean {
    private String name;
    private List<String> data;

    public JavaBean(String n){
        this.name = n;
        data = new ArrayList<String>();
    }

    public void setData(String el){
        this.data.add(el);
    }

    public void print(){
        for (String it: data) {
            Log.d("Java Bean - "+this.name,it);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

之后编译运行,我在虚拟机里跑了一下,可以看到logcat中打印出了每个方法的调用结果:
在这里插入图片描述
下一篇我再尝试一下高级用法,AS中添加几个Chaquopy支持的python库的调用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/418723
推荐阅读
相关标签
  

闽ICP备14008679号