مرحله ساخت پیوند (مرحله ساخت "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
پرچم -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
};