kivy:适用于 android + C++ 的 python

Posted

技术标签:

【中文标题】kivy:适用于 android + C++ 的 python【英文标题】:kivy: python for android + C++ 【发布时间】:2013-07-18 18:29:15 【问题描述】:

我使用 python-for_android 创建了一个在 android 上运行的基于 kivy 的应用程序。

我的应用程序的某些部分已使用 cython 在 c++ 中进行了优化。

我设法使用适用于 android 的 python 和自定义配方来编译我的所有代码。

我的代码在 linux 下也能与 kivy 完美配合。

但在我的安卓设备上,它无法加载一些 c++ 函数。例如,我收到消息:

ImportError: Cannot load library: reloc_library[1307]:  1839 cannot locate '_ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E'...

有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

我终于设法让我的代码在 android 下使用 C++ 运行。

有两个困难:

1 - 从 push_arm 创建的 arm 环境访问 c++ 标头。我必须在我的配方中添加正确的包含,并修改默认的 CXX var:

    #dirty hack
    export C_INCLUDE="-I$ANDROIDNDK/sources/cxx-stl/gnu-libstdc++/$TOOLCHAIN_VERSION/include/ -I$ANDROIDNDK/sources/cxx-stl/gnu-libstdc++/$TOOLCHAIN_VERSION/libs/armeabi/include/"
    export OLD_BOUBOU=$CC
    export CC="$CXX $C_INCLUDE"

    try $BUILD_PATH/python-install/bin/python.host setup.py install -O2
    #try cp libgnustl_shared.so $LIBS_PATH/
    try cp $ANDROIDNDK/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/libgnustl_shared.so $LIBS_PATH/

    export CC=$OLD_BOUBOU

2 - 找到包含 libstl 函数的共享库,并加载它。这是更难的部分:

经过一番研究,我发现 stl 函数存储在 libgnustl_shared.so 中,而不是 listdc++.so 中。所以你必须在你的 apk 中嵌入这个库。

这是try cp $ANDROIDNDK/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/libgnustl_shared.so $LIBS_PATH/这行的目的

然后,您必须加载它。我已经修改了:

src/src/org/renpy/android/PythonActivity.java
src/src/org/renpy/android/PythonService.java
by adding this line after the others System.loadLibrary() :
System.loadLibrary("gnustl_shared");

【讨论】:

【参考方案2】:

我目前正在尝试通过 python-for-android 构建 pybox2d (with swig)。

构建似乎很好的单位我尝试导入 Box2D(从实际 android 设备上的应用程序)我得到一个 “找不到符号 __cxa_end_cleanup”。

不幸的是,上述修复并没有帮助。 还有其他想法吗?

更新: 我可以解决所有问题。 我必须链接到 stlport_shared。

我所有的工作都在我的 https://github.com/DerThorsten/python-for-android/ 的 fork 中。它适用于较新的 ndks,然后是原始的 python-for-android。 它有 Box2D。

【讨论】:

以上是关于kivy:适用于 android + C++ 的 python的主要内容,如果未能解决你的问题,请参考以下文章

适用于 Android 的 Kivy 应用程序无法加载图像

对 Kivy 的 Admob 支持(适用于 Android 的 Python)

在 android for windows 上运行 kivy

使用适用于 android 的字节播放声音

如何打包适用于 iOS 的 Kivy 应用程序?

Android Apk 仅适用于 KivyMd 崩溃