إعدادات الرابط المطلوبة

تحتاج خطوة إنشاء الرابط (مرحلة إنشاء "Link Binary With Libraries" في Xcode) إلى علامات خاصة بـ J2ObjC، والتي تختلف تبعًا لكيفية استخدام تطبيقك لفئات Java المترجمة. يتم تعيين العلامات الأساسية من خلال النص البرمجي لسطر الأوامر j2objcc، ولكن يجب تحديده عند إنشاء باستخدام Xcode.

مكتبات حِزم تطوير البرامج (SDK)

هذه المكتبة مطلوبة لتنفيذ JRE في J2ObjC. عدم تضمين هذا ستؤدي المكتبة إلى حدوث أخطاء رموز غير معروفة مع أسماء تبدأ بـ _iconv.

المكتبةعلامة الرابطالوصف
iconv -l iconv يُستخدَم في jre_core لترميز الأحرف وفك ترميزه.

تُستخدَم هذه المكتبات من خلال تنفيذ JRE في J2ObjC، وقد تحتاج إلى ربطها بتطبيقك.

المكتبةعلامة الرابطالوصف
zip -l z مُستخدَم بواسطة java.util.zip. يجب تضمين هذه المعلومات في حال الربط jre_zip.
الأمان -إطار الأمان يجب ملء هذا الحقل في حال ربط jre_security.

مسار البحث في المكتبة

يشمل توزيع J2ObjC العديد من المكتبات الثابتة؛ لاستخدامها، يحتاج مشروعك إلى إخبار والرابط إلى أين تجدها.

بوجه عام، يجب أن يتضمن مسار بحث المكتبة _$(j2objcdistribution)/lib، حيث يكون متغير _$(j2objcdistribution) هو المسار إلى نسختك المحلية من J2ObjC. على سبيل المثال، إذا تم فك ضغط ملف أرشيف إصدار J2ObjC إلى " /usr/local/"، سيكون هذا المسار "/usr/local/j2objc".

ملاحظة مهمّة: يجب عدم استخدام _$(j2objcdistribution) في مشروعك. حدد دائمًا المسار الفعلي الذي قمت فيه بتثبيت J2ObjC.

إذا أنشأت J2ObjC من نسخة من رمز المصدر الخاص به، ستكون نسختك هي _$(j2objcdistribution) "j2objc/dist/" الدليل. لن يكون هذا الدليل متوفّرًا إلى أن تنشئ J2ObjC باستخدام make dist.

Xcode: مسارات البحث في المكتبات

يمكنك تحديث مسارات البحث في المكتبة لاستهداف التطبيق عن طريق إضافة _$(j2objcdistribution)/lib (مرة أخرى، استخدام) المسار الحقيقي).

مكتبات JRE

تنفذ هذه المكتبات الفئات المحددة بواسطة محاكاة JRE لـ J2ObjC.

ملاحظة: تتضمّن مكتبة libjre_core.a صفوفًا من معظم المجموعات الفرعية الأخرى. المكتبات. الطريقة المُقترَحة لتقليل حجم التطبيق هي البدء في ربط التطبيق مع -l jre_core، ثم إضافة مكتبات المجموعات الفرعية التي تحل أي رموز مفقودة. على سبيل المثال، تتوفّر فئات java.io الأكثر استخدامًا في libjre_core.a، لذلك يجب تضمين مكتبة libjre_io.a فقط في حال وجود أخطاء رموز لم يتم حلّها التي تبدأ أسماؤها بـ JavaIo.

المكتبةعلامة الرابطالوصف
libjre_core.a -l jre_core الحد الأدنى لمجموعة الصفوف مطلوب لمحاكاة JRE لـ J2ObjC، ويشار إليه من جميع ملفات المصدر التي تم إنشاؤها. إذا كانت مصادر Java المترجَمة تشير إلى دعم 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 في حال ربط هذا، ستحتاج أيضًا إلى ربط مكتبة SDK المضغوطة. (يُرجى الاطّلاع على مكتبات حِزم SDK)

libjre_emul.a (-l jre_emul)

تحتوي مكتبة jre_emul على كل الصفوف المضمَّنة في محاكاة JRE لـ J2ObjC. إذا كان التطبيق مرتبطة بـ jre_emul، يجب عدم تضمين أي من مكتبات jre_* الأخرى، وإلا فسيتم تنفيذ للإبلاغ عن أخطاء الرموز المكررة. ويرجع ذلك إلى أنّ jre_emul تتضمّن جميع الصفوف المحدّدة في تلك الصفوف. مكتبات أخرى.

مكتبات J2ObjC الأخرى

يتم تضمين مكتبات Java وفئات استخدام Android في J2ObjC توزيعها كمكتبات ثابتة:

المكتبةعلامة الرابطالوصف
libguava.a -الجوافة Guava: مكتبات Google الأساسية للغة Java
libjavax_inject.a -l javax_inject حقن التبعية JSR-330 مكتبة التعليقات التوضيحية.
libjson.a -l json مكتبة تبادل البيانات بتنسيق JSON هذه هي إصدار Android من JSON، والذي يختلف قليلاً عن عمليات التنفيذ الأخرى.
libjsr305.a -l jsr305 تعليقات JSR-305 التوضيحية للبرامج مكتبة كشف العيوب.
libjunit.a -l junit -ObjC إطار عمل اختبار JUnit.
libmockito.a -l نماذج -ObjC إطار عمل Mockito الذي يرسم نموذجًا لاختبار الوحدات في Java.
libprotobuf_runtime.a -l protobuf_runtime مخزن بروتوكول Google المؤقت محسَّن لتطبيقات J2ObjC يجب أن تجمع التطبيقات التي تستخدم النماذج الأوّلية J2ObjC بيانات النموذج الأوّلي باستخدام j2objc_protoc.
libandroid_util.a -l android_util تحتوي مكتبة "android_util" على مجموعة فرعية صغيرة من فئات الأدوات المساعدة لواجهة برمجة تطبيقات Android. وليس الغرض منه توفير محاكاة لبيئة Android، بل هو مجرد وسيلة لمشاركة فئات مفيدة مثل "android.util.Log".

يتم استخدام علامة -ObjC بشكل متكرر عند ربط تطبيقات iOS، ولكنها لا تكون مطلوبة إلا عندما يكون الهدف يجب تحميل فئات C وفئاتها ديناميكيًا من المكتبات الثابتة. تتسبب هذه العلامة في جميع الفئات في جميع المكتبات الثابتة المرتبطة التي سيتم تضمينها في التطبيق، سواء كانت فعلية أم لا استخدام البيانات المختلفة. لذلك، يُنصح بعدم ربط التطبيقات التي تستخدم J2ObjC بعلامة -ObjC إلا عندما تخفق الفئات في التحميل في وقت التشغيل (أحد الأعراض هو عند طرح JavaLangClassNotFoundException).

يعتمد إطارَا عمل اختبار JUnit وMockito بشكل كبير على الانعكاس، لذا يجب اختبار التطبيقات التي تستخدمهما. الربط بـ -ObjC.

كبديل للربط في مكتبة ثابتة بالكامل بحيث يمكن تحميل بعض الفئات ديناميكيًا هو للإشارة إلى تلك الفئات بشكل ثابت بدلاً من ذلك. في Java، يمكن تنفيذ ذلك في مهيأ ثابت block; إليك مثال من J2ObjC فئة IosSecurityProvider:

  // 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
  };