用NDK在Android上运行Python C++

2024-06-09 23:11:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用NDK从Android到JNI运行一些Python代码,如下所示:

#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可用,或者是否有任何方法交叉编译它以实现这一点


Tags: 代码pyenvmessagestringincludecommandandroid
3条回答

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

您可以使用Chaquopy。要查看在android上运行python的各种工具this,本文将很有帮助

  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测试

相关问题 更多 >