এনডিকে স্ট্যাটিক এবং শেয়ার্ড উভয়ই প্রি-বিল্ট লাইব্রেরি ব্যবহার সমর্থন করে। এই কার্যকারিতার জন্য দুটি প্রধান ব্যবহারের ক্ষেত্রে রয়েছে:
- আপনার উত্স বিতরণ না করেই তৃতীয় পক্ষের NDK বিকাশকারীদের কাছে আপনার নিজস্ব লাইব্রেরি বিতরণ করা।
- আপনার নির্মাণের গতি বাড়ানোর জন্য আপনার নিজস্ব লাইব্রেরির একটি পূর্বনির্মাণ সংস্করণ ব্যবহার করা।
এই পৃষ্ঠাটি ব্যাখ্যা করে কিভাবে প্রি-বিল্ট লাইব্রেরি ব্যবহার করবেন।
একটি প্রি-বিল্ট লাইব্রেরি ঘোষণা করুন
আপনি একটি স্বাধীন মডিউল হিসাবে ব্যবহার করা প্রতিটি পূর্বনির্মাণ লাইব্রেরি ঘোষণা করতে হবে। এটি করার জন্য, নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:
- মডিউলটির একটি নাম দিন। এই নামটি প্রি-বিল্ট লাইব্রেরির মতোই হতে হবে না।
মডিউলের Android.mk ফাইলে,
LOCAL_SRC_FILES
কে আপনি যে প্রি-বিল্ট লাইব্রেরি প্রদান করছেন তার পাথ বরাদ্দ করুন। আপনারLOCAL_PATH
ভেরিয়েবলের মানের সাথে সম্পর্কিত পাথ নির্দিষ্ট করুন।আপনি একটি ভাগ করা (
.so
) বা স্ট্যাটিক (.a
) লাইব্রেরি ব্যবহার করছেন কিনা তার উপর নির্ভর করেPREBUILT_SHARED_LIBRARY
বাPREBUILT_STATIC_LIBRARY
অন্তর্ভুক্ত করুন৷
এখানে একটি তুচ্ছ উদাহরণ রয়েছে যা অনুমান করে যে প্রি-বিল্ট লাইব্রেরি libfoo.so
একই ডিরেক্টরিতে থাকে যেটি Android.mk ফাইলটি বর্ণনা করে।
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
এই উদাহরণে, মডিউলটির নাম পূর্বনির্মাণ লাইব্রেরির মতোই।
বিল্ড সিস্টেম আপনার প্রি-বিল্ট শেয়ার্ড লাইব্রেরির একটি কপি $PROJECT/obj/local
এ রাখে এবং অন্য একটি কপি, ডিবাগ তথ্য ছিনিয়ে $PROJECT/libs/<abi>
এ রাখে। এখানে, $PROJECT
হল আপনার প্রোজেক্টের রুট ডিরেক্টরি।
অন্যান্য মডিউল থেকে পূর্বনির্মাণ লাইব্রেরি উল্লেখ করুন
অন্যান্য মডিউল থেকে একটি প্রি-বিল্ট লাইব্রেরি রেফারেন্স করতে, সেই অন্যান্য মডিউলগুলির সাথে যুক্ত Android.mk ফাইলগুলিতে LOCAL_STATIC_LIBRARIES
বা LOCAL_SHARED_LIBRARIES
ভেরিয়েবলের মান হিসাবে এর নামটি নির্দিষ্ট করুন৷
উদাহরণস্বরূপ, libfoo.so
ব্যবহার করে একটি মডিউলের বর্ণনা নিম্নরূপ হতে পারে:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
এখানে, LOCAL_MODULE
হল মডিউলের নাম যা প্রি-বিল্টকে উল্লেখ করে; LOCAL_SHARED_LIBRARIES
হল প্রি-বিল্টের নাম।
প্রিবিল্ট লাইব্রেরির জন্য হেডার রপ্তানি করুন
foo-user.c
এর কোড নির্দিষ্ট ঘোষণার উপর নির্ভর করে যা সাধারণত হেডার ফাইলে থাকে, যেমন foo.h
, পূর্বনির্মাণ লাইব্রেরির সাথে বিতরণ করা হয়। উদাহরণস্বরূপ, foo-user.c
নিচের মতো একটি লাইন থাকতে পারে:
#include <foo.h>
এই ধরনের ক্ষেত্রে, আপনি যখন foo-user
মডিউল তৈরি করবেন তখন আপনাকে কম্পাইলারকে হেডার এবং এর অন্তর্ভুক্ত পথ প্রদান করতে হবে। এই কাজটি সম্পন্ন করার একটি সহজ উপায় হল প্রি-বিল্ট মডিউল সংজ্ঞায় রপ্তানি ব্যবহার করা। উদাহরণস্বরূপ, যতক্ষণ হেডার foo.h
পূর্বনির্মাণ মডিউলের সাথে যুক্ত include
ডিরেক্টরির অধীনে অবস্থিত, আপনি এটি নিম্নরূপ ঘোষণা করতে পারেন:
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
এখানে LOCAL_EXPORT_C_INCLUDES
সংজ্ঞা নিশ্চিত করে যে বিল্ড সিস্টেম প্রি-বিল্ট লাইব্রেরির include
ডিরেক্টরিতে পাথ রপ্তানি করে, সেই পাথটি LOCAL_C_INCLUDES
এর উপর নির্ভরশীল মডিউলের মান ধরে রেখে।
এই ক্রিয়াকলাপটি বিল্ড সিস্টেমকে প্রয়োজনীয় শিরোনাম খুঁজে পেতে অনুমতি দেয়।
প্রি-বিল্ট লাইব্রেরি ডিবাগ করুন
আমরা সুপারিশ করি যে আপনি ডিবাগ চিহ্ন ধারণকারী পূর্বনির্মাণ শেয়ার্ড লাইব্রেরি প্রদান করুন। NDK বিল্ড সিস্টেম সবসময় $PROJECT/libs/<abi>/
এ ইনস্টল করা লাইব্রেরির সংস্করণ থেকে চিহ্নগুলিকে সরিয়ে দেয়, তবে আপনি ndk-gdb
দিয়ে ডিবাগ করার জন্য ডিবাগ সংস্করণ ব্যবহার করতে পারেন।
প্রি-বিল্ট লাইব্রেরির জন্য ABI নির্বাচন করুন
আপনার লক্ষ্য করা ABI-এর জন্য আপনার পূর্বনির্মাণকৃত শেয়ার্ড লাইব্রেরির সঠিক সংস্করণ নির্বাচন করা নিশ্চিত করতে হবে। Android.mk ফাইলের TARGET_ARCH_ABI
ভেরিয়েবলটি লাইব্রেরির উপযুক্ত সংস্করণে বিল্ড সিস্টেমকে নির্দেশ করতে পারে।
উদাহরণস্বরূপ, অনুমান করুন যে আপনার প্রকল্পে লাইব্রেরির দুটি সংস্করণ রয়েছে libfoo.so
:
armeabi/libfoo.so
x86/libfoo.so
নিম্নলিখিত স্নিপেটটি দেখায় কিভাবে TARGET_ARCH_ABI
ব্যবহার করতে হয় যাতে বিল্ড সিস্টেম লাইব্রেরির উপযুক্ত সংস্করণ নির্বাচন করে:
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)
আপনি TARGET_ARCH_ABI
এর মান হিসাবে armeabi
নির্দিষ্ট করে থাকলে, বিল্ড সিস্টেম armeabi
ডিরেক্টরিতে অবস্থিত libfoo.so
সংস্করণ ব্যবহার করে। আপনি যদি x86
মান TARGET_ARCH_ABI
হিসাবে নির্দিষ্ট করে থাকেন, বিল্ড সিস্টেম x86
ডিরেক্টরিতে সংস্করণ ব্যবহার করে।