تنظیمات پیوند مورد نیاز

مرحله ساخت پیوند (مرحله ساخت "Link Binary With Libraries" Xcode) به پرچم های خاص J2ObjC نیاز دارد که بسته به نحوه استفاده برنامه شما از کلاس های جاوا ترجمه شده متفاوت است. پرچم‌های اصلی توسط اسکریپت خط فرمان j2objcc تنظیم می‌شوند، اما باید هنگام ساخت با Xcode مشخص شوند.

کتابخانه های SDK

این کتابخانه توسط اجرای JRE J2ObjC مورد نیاز است. عدم گنجاندن این کتابخانه منجر به خطاهای علامت تعریف نشده با نام هایی می شود که با _iconv شروع می شوند.

کتابخانه پرچم پیوند شرح
نماد -l iconv توسط jre_core برای رمزگذاری و رمزگشایی کاراکتر استفاده می شود.

این کتابخانه ها توسط پیاده سازی JRE J2ObjC استفاده می شوند و ممکن است لازم باشد به برنامه شما پیوند داده شوند.

کتابخانه پرچم پیوند شرح
زیپ -lz استفاده شده توسط java.util.zip. اگر می خواهید jre_zip را پیوند دهید، باید این مورد را اضافه کنید.
امنیت - امنیت چارچوب در صورت پیوند دادن jre_security الزامی است.

مسیر جستجوی کتابخانه

توزیع J2ObjC شامل چندین کتابخانه استاتیک است. برای استفاده از آنها، پروژه شما باید به پیوند دهنده بگوید کجا آنها را پیدا کند.

به طور کلی، مسیر جستجوی کتابخانه باید شامل _$(j2objc توزیع)/lib باشد، که در آن متغیر _$(j2objc ) مسیر کپی محلی شما از J2ObjC است. به عنوان مثال، اگر یک فایل بایگانی نسخه J2ObjC را در "/usr/local/ از حالت فشرده خارج کنید، این مسیر "/usr/local/j2objc" خواهد بود.

مهم : در واقع از _$(j2objc توزیع) در پروژه خود استفاده نکنید. همیشه مسیر واقعی را که J2ObjC را نصب کرده اید مشخص کنید.

اگر J2ObjC را از روی یک کپی از کد منبع آن بسازید، پس _$(j2objc توزیع) دایرکتوری "j2objc/dist/" کپی شما است. این دایرکتوری تا زمانی که J2ObjC را با make dist نسازید وجود نخواهد داشت.

Xcode: مسیرهای جستجوی کتابخانه

مسیرهای جستجوی کتابخانه هدف برنامه را با افزودن _$(j2objc توزیع)/lib به روز کنید (دوباره از مسیر واقعی استفاده کنید).

کتابخانه های JRE

این کتابخانه ها کلاس های تعریف شده توسط شبیه سازی JRE J2ObjC را پیاده سازی می کنند.

توجه: کتابخانه libjre_core.a شامل کلاس هایی از اکثر کتابخانه های زیرمجموعه دیگر است. روش توصیه شده برای کاهش اندازه برنامه این است که برنامه را با -l jre_core پیوند دهید، سپس کتابخانه های زیرمجموعه را اضافه کنید که نمادهای از دست رفته را برطرف می کند. به عنوان مثال، رایج ترین کلاس های java.io در libjre_core.a هستند، بنابراین فقط اگر خطاهای نماد حل نشده ای وجود داشته باشد که نام آنها با JavaIo شروع می شود، کتابخانه libjre_io.a را شامل شود.

کتابخانه پرچم پیوند شرح
libjre_core.a -l jre_core حداقل مجموعه کلاس‌های مورد نیاز برای شبیه‌سازی JRE J2ObjC که توسط همه فایل‌های منبع تولید شده ارجاع داده می‌شود. اگر منابع جاوا ترجمه شده شما به پشتیبانی JRE برای مواردی مانند شبکه، XML، SQL و غیره اشاره می کنند، کتابخانه های اضافی (در زیر) نیز باید پیوند داده شوند.
libjre_beans.a -l jre_beans همه کلاس ها از بسته java.beans . همه کلاس‌های Java Beans گنجانده نشده‌اند، زیرا بسیاری از آنها فقط توسط برنامه‌های Swing و AWT استفاده می‌شوند.
libjre_channels.a -l jre_channels چندین کلاس از بسته های java.nio.channels و java.nio.channels.spi .
libjre_concurrent.a -l jre_concurrent چندین کلاس از بسته های java.util.concurrent ، java.util.concurrent.atomic و java.util.concurrent.locks .
libjre_icu.a -l jre_icu چندین کلاس از android.icu برای پشتیبانی از مناطق زمانی (عمدتا برای فعال کردن java.time ).
libjre_io.a -l jre_io چندین کلاس (کمتر مورد استفاده) از بسته java.io
libjre_net.a -l jre_net چندین کلاس در بسته java.net . با این حال، کلاس java.net.URLClassLoader در jre_security است، در حالی که کلاس‌های javax.net و javax.net.ssl ​​در jre_ssl هستند.
libjre_security.a -l jre_security بیشتر کلاس‌های بسته java.security (چندتا در jre_core هستند)، و همچنین کلاس‌های بسته‌های java.security.* ، javax.crypto.* و javax.security.* . اگر این را پیوند دهید، باید چارچوب امنیتی iOS را نیز پیوند دهید. (به کتابخانه های SDK مراجعه کنید)
libjre_sql.a -l jre_sql تمام کلاس ها در بسته java.sql .
libjre_ssl.a -l jre_ssl همه کلاس ها در بسته های javax.net و javax.net.ssl .
libjre_time.a -l jre_time تمام کلاس ها در بسته java.time .
libjre_util.a -l jre_util چندین کلاس از بسته java.util و همچنین بسته java.util.logging . اکثر کلاس‌های java.util در jre_core هستند، بنابراین فقط اگر خطاهای نماد JavaUtil* حل‌نشده وجود داشته باشد (نمادهای JavaUtilConcurrent* در کتابخانه jre_concurrent هستند) این کتابخانه را درج کنید.
libjre_xml.a -l jre_xml همه کلاس‌های بسته‌های مرتبط با XML، از جمله javax.xml.* ، org.w3c.dom.* و org.xml.sax.* .
libjre_zip.a -l jre_zip همه کلاس ها از بسته های java.util.zip و java.util.jar . اگر این را پیوند دهید، باید کتابخانه zip SDK را نیز پیوند دهید. (به کتابخانه های SDK مراجعه کنید)

libjre_emul.a ( -l jre_emul )

کتابخانه jre_emul شامل تمام کلاس های موجود در شبیه سازی JRE J2ObjC است. اگر برنامه‌ای با jre_emul پیوند داده شده باشد، هیچ یک از کتابخانه‌های jre_* دیگر نباید گنجانده شود، یا پیوند دهنده خطاهای نماد تکراری را گزارش می‌کند. به این دلیل که jre_emul شامل تمام کلاس های تعریف شده در آن کتابخانه های دیگر است.

سایر کتابخانه های J2ObjC

این کتابخانه‌های جاوا و کلاس‌های کاربردی اندروید در توزیع J2ObjC به عنوان کتابخانه‌های ثابت گنجانده شده‌اند:

کتابخانه پرچم پیوند شرح
libguava.a -ل گواوا Guava: کتابخانه های اصلی گوگل برای جاوا
libjavax_inject.a -l javax_inject کتابخانه حاشیه نویسی تزریق وابستگی JSR-330 .
libjson.a -l json کتابخانه تبادل داده JSON . این نسخه اندروید JSON است که کمی با سایر اجراها متفاوت است.
libjsr305.a -l jsr305 حاشیه نویسی JSR-305 برای کتابخانه تشخیص نقص نرم افزار.
libjunit.a -l junit -ObjC چارچوب آزمون JUnit .
libmockito.a -l mockito -ObjC چارچوب تمسخر Mockito برای تست های واحد در جاوا.
libprotobuf_runtime.a -l protobuf_runtime یک زمان اجرا بافر پروتکل Google ، بهینه‌سازی شده برای برنامه‌های J2ObjC. برنامه هایی که از پروتوباف های J2ObjC استفاده می کنند باید فایل های پروتو خود را با j2objc_protoc کامپایل کنند.
libandroid_util.a -l android_util کتابخانه «android_util» شامل زیرمجموعه کوچکی از کلاس‌های کاربردی Android API است. در نظر گرفته شده است که شبیه سازی برای یک محیط Android ارائه شود، بلکه تنها راهی برای به اشتراک گذاری کلاس های مفید مانند «android.util.Log» است.

پرچم -ObjC اغلب هنگام پیوند دادن برنامه‌های iOS استفاده می‌شود، اما تنها زمانی لازم است که کلاس‌ها و دسته‌های Objective C به صورت پویا از کتابخانه‌های استاتیک بارگیری شوند. این پرچم باعث می‌شود که تمام کلاس‌ها در تمام کتابخانه‌های استاتیک مرتبط، در برنامه گنجانده شوند، خواه واقعاً استفاده شوند یا نه. بنابراین توصیه می‌شود که برنامه‌هایی که از J2ObjC استفاده می‌کنند، فقط زمانی با پرچم -ObjC پیوند برقرار کنند که کلاس‌ها در زمان اجرا بارگذاری نمی‌شوند (یک علامت زمانی است که JavaLangClassNotFoundException پرتاب می‌شود).

چارچوب‌های تست JUnit و Mockito به شدت به بازتاب متکی هستند، بنابراین برنامه‌های آزمایشی که از آنها استفاده می‌کنند باید با -ObjC پیوند داشته باشند.

یک جایگزین برای پیوند در یک کتابخانه کامل استاتیک به طوری که چند کلاس بتوانند به صورت پویا بارگذاری شوند، ارجاع ایستا به آن کلاس ها است. در جاوا، این کار را می توان در یک بلوک اولیه استاتیک انجام داد. در اینجا یک مثال از کلاس IosSecurityProvider J2ObjC آورده شده است:

  // Reference all dynamically loaded classes, so they are linked into apps.
  @SuppressWarnings("unused")
  private static final Class<?>[] unused = {
    IosCertificateFactory.class,
    IosMD5MessageDigest.class,
    IosRSAKeyFactory.class,
    IosRSAKeyPairGenerator.class,
    IosRSASignature.class,
    IosSecureRandomImpl.class,
    IosSHAMessageDigest.class
  };