2013-07-19 28 views
5

Tôi đã sử dụng python-for_android để tạo ứng dụng dựa trên kivy chạy trên Android.kivy: python cho android + C++

Một số phần của ứng dụng của tôi đã được tối ưu hóa bằng C++ khi sử dụng cython.

Tôi quản lý để biên dịch tất cả mã của mình bằng python cho android và công thức nấu ăn tùy chỉnh.

Mã của tôi cũng hoạt động hoàn hảo với kivy trong linux.

Nhưng trên thiết bị Android của tôi, nó không tải được một số chức năng C++. Ví dụ: tôi nhận được thông báo:

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

Bất kỳ ý tưởng nào?

Cảm ơn

Trả lời

5

Cuối cùng tôi đã cố gắng làm cho mã của mình hoạt động bằng cách sử dụng C++ trong Android.

Có hai khó khăn:

1 - Truy cập vào tiêu đề C++ từ môi trường cánh tay được tạo bởi push_arm. Tôi phải thêm chính xác bao gồm trong công thức của mình và sửa đổi CXX mặc định 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 - Tìm thư viện được chia sẻ chứa hàm libstl và tải nó. Đây là phần khó khăn hơn:

Sau một số nghiên cứu, tôi phát hiện ra rằng các hàm stl được lưu trữ trong libgnustl_shared.so và không phải là listdC++. Vì vậy, bạn phải nhúng thư viện này trong apk của bạn.

Đây là mục đích của dòng try cp $ANDROIDNDK/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi/libgnustl_shared.so $LIBS_PATH/

Sau đó, bạn phải tải nó. Tôi đã sửa đổi:

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

Tôi hiện đang cố gắng xây dựng pybox2d (với swig) qua python-for-android.

Việc xây dựng có vẻ là đơn vị tốt tôi cố gắng để nhập khẩu Box2D (từ các ứng dụng trên thiết bị Android thực tế) tôi nhận được một "không thể xác định vị trí biểu tượng __cxa_end_cleanup".

Thật không may những người sửa chữa ở trên không có tác dụng. Bất kỳ ý tưởng nào khác?

Cập nhật: Tôi có thể khắc phục tất cả các sự cố. Tôi phải liên kết với stlport_shared.

Tất cả công việc của tôi ở trong ngã ba của tôi là https://github.com/DerThorsten/python-for-android/. Nó hoạt động với các ndks mới hơn sau đó là python-for-android gốc. Và nó có Box2D.