运行 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
- 为
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 的路径。
将生成的文件夹部署到 Android
系统上的可读文件夹中,然后调用 Py_SetPythonHome
提供该路径。
请注意,可能需要 运行:
Py_Initialize();
std::string command = "print('hello world')";
PyRun_SimpleString(command.c_str());
Py_Finalize();
在 Java 线程以外的线程上。
使用 21.1.6352462
、Python 3.8.6
和 Python 3.9.0
测试。
我想 运行 一些 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
- 为
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 的路径。
将生成的文件夹部署到
Android
系统上的可读文件夹中,然后调用Py_SetPythonHome
提供该路径。请注意,可能需要 运行:
Py_Initialize();
std::string command = "print('hello world')";
PyRun_SimpleString(command.c_str());
Py_Finalize();
在 Java 线程以外的线程上。
使用 21.1.6352462
、Python 3.8.6
和 Python 3.9.0
测试。