2013-07-19 15 views
5

Użyłem python-for_android do stworzenia aplikacji opartej na kivy działającej na Androidzie.kivy: python dla Androida + C++

Niektóre części mojej aplikacji zostały zoptymalizowane w języku C++ za pomocą cython.

Udaje mi się skompilować cały mój kod przy użyciu Pythona dla Androida i niestandardowych receptur.

Mój kod działa również doskonale z kivy pod Linuksem.

Ale na moim urządzeniu z Androidem nie udało się załadować niektórych funkcji C++. Na przykład otrzymuję komunikat:

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

Masz pomysł?

Dzięki

Odpowiedz

5

wreszcie udało mi się zrobić moją pracę kodu przy użyciu C++ pod androida.

Były dwie trudności:

1 - Dostęp do nagłówka C++ ze środowiska ramienia stworzonej przez push_arm. Musiałem dodać poprawny zawiera w mojej receptury i modyfikowania var domyślny CXX:

#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 - znaleźć wspólną bibliotekę zawierającą funkcje libstl i załadować go. To była trudniejsza część:

Po kilku badaniach odkryłem, że funkcje stl są przechowywane w libgnustl_shared.so, a nie listdC++. Więc musisz umieścić tę bibliotekę w swoim apk.

Taki jest cel linii try cp $ANDROIDNDK/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/libgnustl_shared.so $LIBS_PATH/

Następnie trzeba go ładować. Zmodyfikowałem:

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

Obecnie próbuję budować pybox2d (z łykiem) za pośrednictwem Pythona dla Androida.

Kompilacja wydaje się być świetną jednostką, próbuję zaimportować Box2D (z aplikacji na rzeczywiste urządzenie z Androidem). Otrzymałem "nie mogę zlokalizować symbolu __cxa_end_cleanup".

Niestety powyższe poprawki nie pomagają. Jakieś inne pomysły?

Aktualizacja: Mogę naprawić wszystkie problemy. Musiałem połączyć ze stlport_showred.

Cała moja praca jest w moim widelcu https://github.com/DerThorsten/python-for-android/. Działa z nowszymi ndks, a następnie z orginalnym pythonem dla Androida. Ma Box2D.