2013-07-19 59 views
5

我用python-for_android創建了一個在android上運行的基於kivy的應用程序。kivy:python for android + C++

我的應用程序的某些部分已經使用cython在C++中進行了優化。

我設法使用python for android和自定義食譜來編譯我所有的代碼。

我的代碼也可以在linux下與kivy完美配合。

但在我的android設備上,它無法加載一些C++函數。例如,我收到消息:

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

任何想法?

感謝

回答

5

我終於用C++下的android使我的工作。

有兩個困難:

1 - 從由push_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"); 
0

我目前正在嘗試通過python-for-android構建pybox2d(與swig)。

構建似乎是很好的單位,我嘗試導入Box2D(從實際的Android設備上的應用程序)我得到一個 「無法找到符號__cxa_end_cleanup」。

不幸的是,上述修補程序doies沒有幫助。 有沒有其他想法?

更新: 我可以修復所有問題。 我不得不鏈接到stlport_shared。

我所有的工作都在我的分支https://github.com/DerThorsten/python-for-android/。它適用於較新的ndks,然後是原始的python-for-android。 它有Box2D。