LoginSignup
21
15

More than 1 year has passed since last update.

AndroidアプリでPythonライブラリを使う 【Chaquopy】

Last updated at Posted at 2022-09-25

概要

Chaquopyを使ってJava/Kotlin製Androidアプリの一部をPythonで実装し、Pythonライブラリを使う方法を紹介します。
本記事ではNumPyで乱数を生成し、Kotlin製Androidアプリの画面に表示します。

Chaquopyとは

Chaquopyとは、Java/Kotlin製AndroidアプリにPythonの実装を組み込むことができるSDKです。SciPyやPyTorchなど豊富なライブラリに対応しており、JavaやKotlinで扱いにくい処理をPythonで記述できます。

以前はライセンスの制約がありましたが、2022/07/24にオープンソース化し、MITライセンスとなったことで使いやすくなりました。

使い方

環境

  • MacBook Pro (2020年モデル / BigSur 11.6.4)
  • Android Studio (Bumblebee | 2021.1.1 Patch 2)

新規Androidプロジェクトの作成

Python実装を組み込む先のAndroidアプリとして、Empty Activiyの新規プロジェクトを作成します。
プロジェクトの作成方法はこちらをご参照ください。

Chaquopyの追加

公式の手順に従い、top level及びmodule levelのbuild.gradleに下記を追加します。

build.gradle
plugins {
    id 'com.chaquo.python' version '12.0.1' apply false
}
build.gradle(:app)
plugins {
    id 'com.android.application'
    id 'com.chaquo.python'
}

...

defaultConfig {
    ndk {
       abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
    }
}

ライブラリ(NumPy)の追加

build.gradle(module level)のdefaultConfig内にrequirementを記述し、NumPyを追加します。

build.gradle(:app)
python {
    pip {
        install "numpy"
    }
}

Pythonスクリプトの用意

Chaquopyはデフォルトでsrc/main/pythonのPythonスクリプトを読み込みます。
chaquopy_test.pyを作成し、src/main/pythonに配置します。

chaquopy_test.py
import numpy as np

def create_random_number():
    return np.random.rand()

KotlinからPythonスクリプトを呼び出し

生成した乱数を画面に表示するため、更新対象のTextViewにidを追加します。

activity_main.xml
<TextView
    android:id="@+id/text_view"
    ...
/>

create_random_numberを呼び出して乱数を生成し、TextViewを更新します。

MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Pythonコードを実行する前にPython.start()の呼び出しが必要
        if (!Python.isStarted()) {
            Python.start(AndroidPlatform(this))
        }

        val py = Python.getInstance()
        val module = py.getModule("chaquopy_test") // スクリプト名

        try {
            val randomNumber = module.callAttr("create_random_number").toFloat() // 関数名
            findViewById<TextView>(R.id.text_view).text = randomNumber.toString()
        } catch (e: PyException) {
            Toast.makeText(this, e.message, Toast.LENGTH_LONG).show()
        }
    }
}

実行

画面に生成した乱数が表示されました。

おわりに

Chaquopyを使うと簡単にPythonスクリプトをAndroidアプリに組み込むことができます。対応しているライブラリやバージョン等の制限はありますが、SciPyやNumPyといった有名どころのライブラリを使う上では十分活用できるのではと思います。

別の記事ではChaquopy+PyTorchでMobileNetv3を動作させる例を紹介しています。

21
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
15