Sử dụng thư viện tạo sẵn

NDK hỗ trợ sử dụng thư viện tạo sẵn, cả tĩnh và dùng chung. Có hai trường hợp sử dụng chính cho chức năng này:

  • Phân phối thư viện của riêng bạn cho các nhà phát triển NDK bên thứ ba mà không cần phân phối nguồn.
  • Sử dụng phiên bản tạo sẵn của thư viện riêng để tăng tốc bản dựng.

Trang này giải thích cách sử dụng thư viện tạo sẵn.

Khai báo thư viện tạo sẵn

Bạn phải khai báo từng thư viện tạo sẵn mà bạn dùng làm mô-đun độc lập. Để khai báo, hãy thực hiện các bước sau:

  1. Đặt tên cho mô-đun. Tên này không cần phải giống như tên của thư viện tạo sẵn.
  2. Trong tệp Android.mk của mô-đun, hãy chỉ định cho LOCAL_SRC_FILES đường dẫn đến thư viện tạo sẵn mà bạn cung cấp. Chỉ định đường dẫn tương ứng với giá trị của biến LOCAL_PATH.

  3. Đưa PREBUILT_SHARED_LIBRARY hoặc PREBUILT_STATIC_LIBRARY vào, tuỳ thuộc vào việc bạn đang sử dụng thư viện dùng chung (.so) hay thư viện tĩnh (.a).

Sau đây là một ví dụ nhỏ giả định thư viện tạo sẵn libfoo.so nằm trong cùng thư mục với tệp Android.mk mô tả thư viện này.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)

Trong ví dụ này, tên của mô-đun giống với tên của thư viện tạo sẵn.

Hệ thống xây dựng sẽ đặt một bản sao của thư viện dùng chung tạo sẵn vào $PROJECT/obj/local và một bản sao khác đã loại bỏ thông tin gỡ lỗi vào $PROJECT/libs/<abi>. Ở đây, $PROJECT là thư mục gốc của dự án.

Tham chiếu thư viện tạo sẵn của các mô-đun khác

Để tham chiếu thư viện tạo sẵn của các mô-đun khác, hãy chỉ định tên của thư viện làm giá trị của biến LOCAL_STATIC_LIBRARIES hoặc LOCAL_SHARED_LIBRARIES trong các tệp Android.mk liên kết với các mô-đun khác đó.

Ví dụ: Nội dung mô tả về một mô-đun sử dụng libfoo.so có thể như sau:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)

Ở đây, LOCAL_MODULE là tên của mô-đun tham chiếu đến thư viện tạo sẵn; LOCAL_SHARED_LIBRARIES là tên của chính thư viện tạo sẵn.

Xuất tiêu đề cho thư viện tạo sẵn

Mã trong foo-user.c phụ thuộc vào các nội dung khai báo cụ thể thường nằm trong tệp tiêu đề, chẳng hạn như foo.h, được phân phối cùng với thư viện tạo sẵn. Ví dụ: foo-user.c có thể có dòng như sau:

#include <foo.h>

Trong trường hợp này, bạn cần cung cấp tiêu đề và đường dẫn bao gồm (include) cho trình biên dịch khi xây dựng mô-đun foo-user. Cách đơn giản để thực hiện việc này là sử dụng nội dung xuất trong định nghĩa mô-đun được tạo sẵn. Ví dụ: Miễn là tiêu đề foo.h nằm trong thư mục include liên kết với mô-đun tạo sẵn, bạn có thể khai báo tiêu đề như sau:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

Định nghĩa LOCAL_EXPORT_C_INCLUDES ở đây đảm bảo rằng hệ thống xây dựng xuất đường dẫn tới thư mục include của thư viện tạo sẵn, đặt đường dẫn đó vào đầu giá trị của LOCAL_C_INCLUDES cho mô-đun phụ thuộc.

Thao tác này cho phép hệ thống xây dựng tìm tiêu đề cần thiết.

Gỡ lỗi thư viện tạo sẵn

Bạn nên cung cấp các thư viện dùng chung tạo sẵn chứa ký hiệu gỡ lỗi. Hệ thống xây dựng NDK luôn xoá các ký hiệu khỏi phiên bản thư viện mà hệ thống cài đặt vào $PROJECT/libs/<abi>/. Tuy nhiên, bạn có thể sử dụng phiên bản gỡ lỗi để gỡ lỗi bằng ndk-gdb.

Chọn ABI cho thư viện tạo sẵn

Bạn phải đảm bảo chọn đúng phiên bản thư viện dùng chung tạo sẵn cho ABI mà bạn nhắm mục tiêu. Biến TARGET_ARCH_ABI trong tệp Android.mk có thể chỉ cho hệ thống xây dựng tìm đến phiên bản thư viện thích hợp.

Ví dụ: Giả sử dự án của bạn chứa hai phiên bản thư viện libfoo.so:

armeabi/libfoo.so
x86/libfoo.so

Đoạn mã sau đây cho biết cách sử dụng TARGET_ARCH_ABI để hệ thống xây dựng có thể chọn phiên bản thư viện thích hợp:

include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

Nếu bạn đã chỉ định armeabi làm giá trị của TARGET_ARCH_ABI, hệ thống xây dựng sẽ sử dụng phiên bản của libfoo.so nằm trong thư mục armeabi. Nếu bạn đã chỉ định x86 làm giá trị TARGET_ARCH_ABI, thì hệ thống xây dựng sẽ sử dụng phiên bản trong thư mục x86.