【Android】Chaquopyを使ったAndroidアプリ開発
はじめに
Chaquopyを使えばローカルのPythonスクリプトをAndroidアプリに簡単に組み込んで試すことができる
Chaquopyを使ってAndroidアプリ上でpythonコードを動かすところまでをやってみた
Android Studio : Flamingo 2022
各種設定ファイルへの追記
まずは、各種設定ファイルへの追記を行う
Androidプロジェクトを作成すると2種類のbuild.gradleが作成される
上側がプロジェクトレベルのbuild.gradle
下側がアプリレベルの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'
}
- つづいて、アプリレベルの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エミュレーター向け
- 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から書き換え/取得してみる
#適当な関数を作ってみる
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());
}
}
【参考サイト】
Discussion