2010-05-31 27 views
32

Tôi đang cố gắng biên dịch một thư viện tĩnh để sử dụng trên Android nhưng tôi không thể tìm ra cách biên dịch nó. Thư viện sử dụng các thư viện chuẩn (stdio.h etc ...) và libxml2.Làm thế nào để biên dịch một thư viện tĩnh bằng cách sử dụng NDK của Android?

Tôi cố gắng để biên dịch sử dụng cánh tay-EABI-gcc nhưng tôi nhận được lỗi sau:

/cygdrive/c/android-ndk-R4/build/nền tảng/android-8/arch-x86/usr /include/asm/posix_types.h:15:28: lỗi: posix_types_64.h: Không có tệp hoặc thư mục nào như vậy

Làm cách nào để làm việc này?

Trả lời

44

Như tôi đã hiểu, phương pháp đúng là sử dụng ndk-build và không gọi trực tiếp trình biên dịch.

Trong Android.mk bạn cần chỉ định mô-đun cho từng thư viện tĩnh bạn muốn biên dịch, sau đó chỉ định thư viện được chia sẻ của bạn nên sử dụng nó.

Ví dụ về một tập tin Android.mk sửa đổi của dự án mẫu hello-JNI:

Nếu bạn muốn kiểm soát những mô-đun để biên dịch khi bạn chạy ndk-xây dựng bạn có thể tạo tạo ra một ứng dụng . mk tập tin (trong cùng thư mục với Android.mk) và liệt kê tất cả các mô-đun như trong ví dụ sau:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n> 
+0

tôi đã làm tương tự nhưng vẫn không hoạt động, xem http: // stackoverflow.com/questions/10106965/how-to-link-any-libarary-in-ndk-application –

+7

Bạn có thể tạo một thư viện tĩnh (tệp .a) mà không có thư viện dùng chung không? – user1027169

+0

[Biên dịch thư viện tĩnh sử dụng chuỗi công cụ độc lập cho android] (https://tariqzubairy.wordpress.com/2012/03/09/arm-binaries-static-library-for-android/) – TMZ

6

để đối phó với

Can you generate a static library (.a file) without a shared library that uses it?

(điều này thực sự phải là câu hỏi riêng), câu trả lời là có.

Theo mặc định, NDK sẽ chỉ xây dựng các tệp thi hành và thư viện được chia sẻ (tất nhiên là phụ thuộc của chúng). Tuy nhiên, bạn có thể buộc NDK xây dựng một thư viện tĩnh độc lập bằng cách tham chiếu rõ ràng nó trong Application.mk của bạn.

Giả sử mô-đun thư viện tĩnh của bạn là LOCAL_MODULE: = libXYZ, thêm dòng sau vào Application.mk (tạo tập tin trong thư mục tương tự như Android.mk của bạn nếu nó không tồn tại):

APP_MODULES := XYZ 

Lưu ý giá trị APP_MODULES không bao gồm tiền tố lib được bao gồm trong tên mô-đun thư viện tĩnh của bạn.

Ngoài ra, nếu bạn không muốn để tạo ra một Application.mk, bạn có thể chỉ định giá trị trên dòng lệnh: ndk-build APP_MODULES=XYZ

1

Một trick mát: nếu bạn có một tập tin Android.mk, bạn có thể thay đổi xây dựng loại từ:

include $(BUILD_SHARED_LIBRARY) 

để

include $(BUILD_STATIC_LIBRARY) 

và .a thư viện sẽ được sản xuất vào obj/thư mục vào kiến ​​trúc tương ứng của họ khi bạn NDK-xây dựng lib rary.

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