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)
và 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)
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. –
@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. –
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? –