💬

【Android】Chaquopyを使ったAndroidアプリ開発

2024/07/10に公開

はじめに

Chaquopyを使えばローカルのPythonスクリプトをAndroidアプリに簡単に組み込んで試すことができる
Chaquopyを使ってAndroidアプリ上でpythonコードを動かすところまでをやってみた

Android Studio : Flamingo 2022

各種設定ファイルへの追記

まずは、各種設定ファイルへの追記を行う
Androidプロジェクトを作成すると2種類のbuild.gradleが作成される

上側がプロジェクトレベルのbuild.gradle
下側がアプリレベルのbuild.gradle

  1. プロジェクトレベルのbuild.gradleに下記を追加する
build.gradle
buildscript {
    repositories {
        google()
        mavenCentral()
        maven { url "https://chaquo.com/maven" }
    }
    dependencies {
        classpath "com.chaquo.python:gradle:15.0.1"
    }
}

plugins {
    id 'com.chaquo.python'
}
  1. つづいて、アプリレベルのbuild.gradleに下記を追加する
build.gradle
plugins {
    id 'com.chaquo.python'
}

android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }
        python {
            pip {
                install "numpy"
            }
        }
    }
}

なお、abiファイルはアプリ・バイナリ・インターフェースの略で下記のように各環境向けに設定が必要
armeabi-v7a, arm64-v8a : Android端末に対応
x86, x86_64 : Androidエミュレーター向け

  1. AndroidManifest.xmlに下記を追加する
AndroidManifest.xml
<application
    android:name="com.chaquo.python.android.PyApplication">
</application>

最後に、"Sync Now"ポップアップが画面に表示されるはずなので、変更を同期させる
エラーが出なければ、次に進む

.pyファイルの準備

src/mani/python/にpythonのソースファイル(.py)を準備します
AndroidではこのPath(src/mani/python/)の.pyファイルをデフォルトで認識するらしいので、こちらにソースをおいておくと良い

今回は、テストのため下記ようなpythonスクリプトを準備

一つは、関数の中で文字列を定義してそれを返すだけ
Javaからは返り値のtextを受け取って、Logに表示してみる
なお、printはLogcatに出力されるので、通常のpython同様、デバッグ等に活用できる

もう一つはSampleClassというクラスを定義して、get/setでメンバ変数をJavaから書き換え/取得してみる

src/mani/python/test.py
#適当な関数を作ってみる
def PyHello():
    text="hello python!"
    print(text)
    return text

#適当なクラスを作ってみる
class SampleClass():
    val = 10

    def get_val(self):
        return self.val

    def set_val(self, new_val):
        self.val = new_val

動作テスト

activity_main.xmlを変更してButtonを適当に設定しておく
なお、TextViewとButtonはそれぞれidをつけておく(ここでは、tvTextとbtPythonを設定)

ボタンのClickListenerに対して下記のような処理を追加する
ボタンを押すことで、前記のpythonコードが実行される

private class GetPythonText implements View.OnClickListener{
    @Override
    public void onClick(View view){

        Python py = Python.getInstance();
        PyObject module = py.getModule("test");
        String pyText = module.callAttr("PyHello").toString();
        Log.d("python", pyText);

        //クラスはPyObjectで受け取る
        PyObject pyclass = module.callAttr("SampleClass");
        Integer pyVal = pyclass.callAttr("get_val").toInt();
        Log.d("python", pyVal.toString());

        //setメソッドでメンバ書き換え
        pyclass.callAttr("set_val", 100);
        pyVal = pyclass.callAttr("get_val").toInt();
        Log.d("python", pyVal.toString());

    }
}

【参考サイト】
https://chaquo.com/chaquopy/doc/current/faq.html

Discussion