2013-02-17 31 views
5

Tôi có một loạt thư viện hiện có mà tôi cần phải sử dụng lại trong một ứng dụng Android. Cách bố trí tương tự như:Cách tạo nhiều dự án theo thứ tự phụ thuộc chính xác với NDK của Android?

\ Libraries \ libOne
\ Libraries \ libTwo [thư viện tĩnh]
\ Libraries \ libThree
\ Applications \ MyApplication \ [Ứng dụng]

libTwo phụ thuộc trên libOnelibThree tùy thuộc vào libTwo. Làm cách nào để tôi có thể xây dựng hệ thống để xây dựng tất cả các thư viện theo đúng thứ tự? Tôi đang cố gắng sử dụng Eclipse, nhưng nếu cần thiết tôi có thể sử dụng dòng lệnh.

Tất cả các thư viện này cuối cùng sẽ được một ứng dụng Java tham chiếu (và sử dụng JNI để tương tác với chúng). Bất kỳ manh mối nào về cách tôi thiết lập tệp Android.mk/Application.mk?

Tôi đã thử sử dụng BUILD_STATIC_LIBRARY cho libTwo, nhưng nó không thực sự xuất bất kỳ tệp nào! Tôi đã mong đợi tệp libTwo.a nhưng không có gì được biên dịch hoặc xây dựng.

Tôi có viết một ứng dụng Android.mk vào ứng dụng không? Hoặc Android.mk cho từng dự án?

+0

bạn có thể chia sẻ Android.mk của bạn? Không rõ cách bạn thiết lập dự án của mình. –

+0

@AlexCohn Tôi chưa có Android.mk đang hoạt động, đó là vấn đề. Tôi đang tìm một câu trả lời mô tả cách xây dựng cả ba thư viện và liên kết chúng với nhau từ ứng dụng chính. –

+0

Tôi hiểu rằng bạn chưa có Android.mk đang hoạt động, nhưng bạn có một chiếc máy chưa hoạt động, phải không? –

Trả lời

0

Có phần android trong thuộc tính của dự án, nơi bạn có thể chỉnh sửa phụ thuộc thư viện. Nó chỉ có thể được sử dụng, nếu libOne libTwo và libThree được đánh dấu là thư viện, trong bảng thuộc tính của chúng.

3

OK, bây giờ tôi thấy chỉnh sửa của bạn và điều này giúp bạn trả lời câu hỏi cụ thể.

Bạn phải có ít nhất một tệp Android.mk cho ứng dụng nếu bạn muốn sử dụng Android NDK để tạo thư viện gốc của bạn. Tuy nhiên, đây không phải là một yêu cầu. Đó là OK để xây dựng nó mặc dù Cmake, hoặc một "toolchain độc lập" với makefiles "truyền thống", hoặc với một MS Visual Studio plugin, hoặc bất kỳ cách nào khác. Đó là kết quả quan trọng. Kết quả là một đối tượng chia sẻ được xây dựng với một trình biên dịch tương thích cho một thời gian chạy bionic.

Giúp bạn đặt thư viện trong thư mục ${project_root}/libs/armeabi/ (cho thiết bị tương thích ARM v6, các thư mục con khác cho x86, MIPS, cánh tay v7a) để cho phép trình tạo APK gói chính xác, để cho phép trình cài đặt ứng dụng giải nén phiên bản chính xác (tương thích với bộ xử lý thiết bị) vào thư mục /data/data/${package_name}/lib trên thiết bị và cuối cùng để có thể sử dụng System.loadLibrary(short_name) để sử dụng nó từ Java. Nhưng cũng có thể đóng gói tệp so một cách khác nhau, giải nén nó theo cách thủ công và tải nó từ bất kỳ vị trí nào trên hệ thống tệp thiết bị (miễn là ứng dụng của bạn có quyền viết và đọc tệp này).

Nhưng nếu chúng tôi lọc ra các trường hợp ngoại lệ, sẽ dễ dàng hơn khi có Android.mk trong thư mục ${project_root}/jni. Trong điều khoản của ndk-build lệnh, mỗi thư viện là một MODULE riêng biệt, nhưng tất cả ba có thể được xác định trong một tập tin Android.mk. Mặt khác, nếu thư viện của bạn bị cô lập (ví dụ: đến từ các bên thứ ba riêng biệt), có thể bạn sẽ thích tạo ba tệp Android.mk. May mắn thay, ndk-build là gì, nhưng một wrapper quanh gnu thực hiện, và tuyên bố đơn giản include trong Android.mk hoạt động như trong bất kỳ makefiles khác.

Nói tóm lại, trường hợp của bạn có lẽ bao phủ bởi một Applications/MyApplication/ [Application]/jni/Android.mk tập tin đơn giản:

include ../../Libraries/libOne/Android.mk 
include ../../Libraries/libTwo/Android.mk 
include ../../Libraries/libThree/Android.mk 

Tôi không biết những gì phụ thuộc bạn có giữa libOne và libTwo, nhưng đối với libOne file Libraries/libOne/Android.mk sẽ trông giống như

LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

Libraries/libThree/Android.mk

LOCAL_PATH = $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libThree 
LOCAL_SRC_FILES := third.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo 
LOCAL_STATIC_LIBRARIES := libOne libTwo 
include $(BUILD_SHARED_LIBRARY) 

Bạn nên chạy ndk-build từ thư mục Applications/MyApplication/ [Application] - hoặc từ dấu nhắc lệnh hoặc thông qua plugin ADT của Eclipse.

cập nhật cùng có thể được thể hiện bằng một Android.mk tập tin trong thư mục jni:

LOCAL_PATH = ../../Libraries/libOne 
include $(CLEAR_VARS) 
LOCAL_MODULE := libOne 
LOCAL_SRC_FILES := first.c 
include $(BUILD_STATIC_LIBRARY) 

LOCAL_PATH = ../../Libraries/libThree 
include $(CLEAR_VARS) 
LOCAL_MODULE := libThree 
LOCAL_SRC_FILES := third.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../libOne $(LOCAL_PATH)/../libTwo 
LOCAL_STATIC_LIBRARIES := libOne libTwo 
include $(BUILD_SHARED_LIBRARY) 
+0

Cảm ơn vì điều này, tôi đã thử sử dụng nhiều tệp Android.mk, nhưng nó đã gây ra sự cố khi xác định lại LOCAL_PATH ('$ (gọi my-dir)' trả về thư mục lõi NDK, chứ không phải thư mục thực khi không được gọi trên dòng đầu tiên! –

+0

'' (gọi my-dir) 'nên là một trong những dòng đầu tiên trong một tệp. Nhưng điều này không liên quan gì đến câu hỏi của một hoặc nhiều tệp Android.mk. Xem ** cập nhật ** –

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