运行 Python 来自 C++ on Android 使用 NDK

Run Python from C++ on Android using NDK

我想 运行 一些 Python 代码来自 Android 通过 JNI 使用 NDK 像这样:

#include <jni.h>
#include <string>
#include <stdio.h>

#include <Python.h>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_mypythonapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */)
{
    std::string command = "print('Hello World from Python!!!')";

    PyObject* pInt;

    Py_Initialize();

    PyRun_SimpleString(command.c_str());

    Py_Finalize();

    std::string message = "Command ";
    message.append(command);
    message.append(" was executed successfully!")

    return env->NewStringUTF(message.c_str());
}

是否有可用于 Android 的预构建 libpython 或是否有任何交叉编译它以实现该目的的方法?

您可以使用 Chaquopy. To see various tools to run python on android this 文章会有所帮助

Python 只能在主机下使用:

~/ndk/21.3.6528147$ find -iname *py*.so -o -iname *py*.a
./prebuilt/linux-x86_64/lib/libpython2.7.a
./prebuilt/linux-x86_64/lib/python2.7/config/libpython2.7.a
./prebuilt/linux-x86_64/lib/python2.7/lib-dynload/pyexpat.so

  1. Android 编译 Python 使用:
┌─[19:20:55]─[jacob@jacob-pc]─[~]
└──> export ANDROID_NDK_ROOT=/path/to/android-ndk

┌─[19:20:55]─[jacob@jacob-pc]─[~]
└──> ./configure CC=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang  CXX=$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++ AR=aarch64-linux-android-ar LD=aarch64-linux-android-ld RANLIB=aarch64-linux-android-ranlib --target=arm-linux-androideabi -prefix=/path/to/install/dir --enable-shared --without-sqlite3 --without-pdo-sqlite --without-pear --enable-simplexml --disable-mbregex --enable-sockets --enable-fpm --disable-opcache --enable-libxml --without-zlib --build=x86_64-linux-gnu --disable-all --disable-ipv6 ac_cv_have_long_long_format=yes ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no

┌─[19:20:55]─[jacob@jacob-pc]─[~]
└──> make

┌─[19:20:55]─[jacob@jacob-pc]─[~]
└──> make install

或者,更简单,using docker

┌─[19:20:55]─[jacob@jacob-pc]─[~]
└──> docker run --rm -it -v $(pwd):/python3-android -v /path/to/android-ndk:/android-ndk:ro --env ARCH=arm --env ANDROID_API=21 python:3.9.0-slim /python3-android/docker-build.sh

/path/to/android-ndk 替换为 Android NDK 的路径。

  1. 将生成的文件夹部署到 Android 系统上的可读文件夹中,然后调用 Py_SetPythonHome 提供该路径。

  2. 请注意,可能需要 运行:

Py_Initialize();
std::string command = "print('hello world')";
PyRun_SimpleString(command.c_str());
Py_Finalize();

在 Java 线程以外的线程上。

使用 21.1.6352462Python 3.8.6Python 3.9.0 测试。