2011-06-22 36 views
8

Tôi đang cố gắng xây dựng một ứng dụng Android sử dụng các thư viện tĩnh từ một số mã C++ hiện có. Tuy nhiên tôi dường như không thể xây dựng mọi thứ, sau đây là các bước tôi đã thực hiện cho đến thời điểm này ..sử dụng các thư viện tĩnh dựng sẵn để phát triển NDK của Android

Tôi có ndk-r5b và đã xây dựng chuỗi công cụ độc lập theo ndk/docs/STANDALINE-TOOLCHAIN.html. Sau đó tôi đã sử dụng trình biên dịch chuỗi công cụ độc lập (arm-linux-androideabi-g ++) thay vì g ++ cho cờ CXX trong Makefile để biên dịch các thư viện tĩnh mà tôi cần. Điều này biên dịch mà không có lỗi và có 3 thư viện tĩnh được tạo ra. Đây là một đoạn mã của một số các cờ dùng để xây dựng các thư viện dựng sẵn:

CXX = arm-linux-androideabi-g++ 
SYSTEM_LIBS = -lstdc++ -lm 
INCLUDE_PATH += ${NDK_PATH}/platforms/android-8/arch-arm/usr/include/ 

Đây là một dòng mẫu được sản xuất từ ​​các makefile khi biên dịch:

arm-linux-androideabi-g++ -c -DTIME_SIM -I./include -I/home/greg/dev/Android/android-ndk-r5b/platforms/android-8/arch-arm/usr/include/ -fpic -ggdb3 -SimTime.C -o SimTime.o 

Tiếp theo, tôi xây dựng ứng dụng bằng cách sử dụng ndk-build bằng cách sử dụng sau cho Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := engine 
LOCAL_SRC_FILES := ../libs/libEngine.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := shmem 
LOCAL_SRC_FILES := ../libs/libShMem.a 
include $(PREBUILT_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := util 
LOCAL_SRC_FILES := ../libs/libUtil.a 
include $(PREBUILT_STATIC_LIBRARY) 

# build server as a shared library 
include $(CLEAR_VARS) 
LOCAL_MODULE := libServer 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../include 

LOCAL_SRC_FILES := \ 
    Server.C \ 
    Router.C \ 
    RouterMsgs.C \ 
    Federation.C \ 
    cripName.C \ 
    ver.C \ 
    JNIWrapper.cpp 
LOCAL_STATIC_LIBRARIES := engine shmem util 
include $(BUILD_SHARED_LIBRARY) 

Thư viện dựng sẵn biên dịch tiền phạt bằng trình biên dịch công cụ độc lập được cung cấp trong andro id ndk. Tuy nhiên có rất nhiều tài liệu tham khảo chưa được giải quyết cho ostream khi liên kết thư viện được chia sẻ với các thư viện dựng sẵn bằng cách sử dụng ndk-build. Đối với exampe:

/home/android/obj/local/armeabi/libShMem.a(SubscriptionItem.o): In function `SUBSCRIPTION_ITEM::Print(std::basic_ostream<char, std::char_traits<char> >&)':/home/src/comm/SubscriptionItem.C:97: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 

Tôi giả sử tôi đang thiếu một số cờ quan trọng hay không làm điều gì đó đúng khi tôi đang biên soạn bằng cách sử dụng trình biên dịch độc lập nhưng bất kỳ sự giúp đỡ hoặc cái nhìn sâu sắc về vấn đề này sẽ được đánh giá rất nhiều như tôi không thể dường như tìm thấy điều này trả lời trên google hoặc trong bất kỳ tài liệu ndk android nào. Cảm ơn!

+0

Tôi không chắc chắn đây là một ý tưởng hay. Nếu bạn xây dựng một thư viện được liên kết tĩnh hoàn toàn phụ thuộc vào libstdC++, bạn sẽ kết thúc bao gồm một bản sao của các hàm đó trong thư viện. Nhưng khi bạn tải thư viện trên điện thoại, bạn sẽ tải nó vào một quá trình đã có bản đồ chia sẻ của libstdC++ mà ứng dụng được kế thừa khi nó được tách ra khỏi zygote. Đây là, tối thiểu, lãng phí. Nó có thể là tốt hơn để sử dụng cờ xây dựng để cho phép các thư viện có phụ thuộc không hài lòng? –

Trả lời

1

Tôi đã gặp vấn đề tương tự và giải quyết vấn đề bằng cách thêm mô-đun cho thư viện C++ chuẩn. Thư viện được liên kết bởi hệ thống xây dựng ndk là từ vị trí sai (nền tảng/android-9/arch-arm/usr/lib trong trường hợp của tôi).

include $(CLEAR_VARS) 
LOCAL_MODULE := rightstdc 
LOCAL_SRC_FILES := <path to the correct libstdc++.a> 
include $(PREBUILT_STATIC_LIBRARY) 

Thêm thẻ mô-đun vào danh sách các thư viện tĩnh:

LOCAL_STATIC_LIBRARIES := engine shmem util rightstdc 

Các build/core/build-binary.mk prepends -L$(SYSROOT)/usr/lib nếu bất kỳ thư viện được quy định tại LOCAL_LDLIBS nhưng trong trường hợp của tôi đó là con đường sai lầm.

Tôi không biết nếu có một bước bị thiếu nên sao chép đúng libstdC++ đến vị trí đó nhưng cách tiếp cận ở trên sẽ hoạt động.

+0

Thêm thông tin liên quan đến thư viện C++ của bạn trong Application.mk cùng với một số cờ cpp –

3

Vâng, bạn thực sự có thể khắc phục điều đó bằng cách tạo ra một Application.mk tập tin bên trong thư mục tương tự như các tập tin Android.mk là, bao gồm:

APP_STL := stlport_static 

cho việc sử dụng stlport tĩnh tọa lạc bên trong NDK của Android.

Các vấn đề liên quan