必要なリンク設定

リンクビルド ステップ(Xcode の「Link Binary With Libraries」ビルドフェーズ)には、J2ObjC 固有のフラグが必要です。これは、アプリケーションで変換済みの Java クラスの使用方法によって異なります。コアフラグは j2objcc コマンドライン スクリプトによって設定されますが、Xcode を使用してビルドするときに指定する必要があります。

SDK ライブラリ

このライブラリは J2ObjC の JRE 実装で必須です。このライブラリを含めないと、名前が _iconv で始まる未定義のシンボルエラーが発生します。

ライブラリリンクフラグ説明
iconv -l アイコン jre_core が文字のエンコードとデコードに使用します。

これらのライブラリは J2ObjC の JRE 実装で使用されるため、アプリにリンクが必要になる場合があります。

ライブラリリンクフラグ説明
zip -l・z java.util.zip で使用されます。jre_zip をリンクする場合は、これを含める必要があります。
セキュリティ - フレームワーク セキュリティ jre_security をリンクする場合は必須。

図書館検索のパス

J2ObjC のディストリビューションには、いくつかの静的ライブラリが含まれています。静的ライブラリを使用するには、プロジェクトがライブラリの場所をリンカーに伝える必要があります。

一般に、ライブラリ検索パスには _$(j2objcdistribution)/lib を含める必要があります。_$(j2objcdistribution) 変数は、J2ObjC のローカルコピーへのパスです。たとえば、J2ObjC リリース アーカイブ ファイルを「/usr/local/」に解凍した場合、このパスは「/usr/local/j2objc」になります。

重要: プロジェクトで実際に _$(j2objc distribution) を使用しないでください。必ず、J2ObjC をインストールした実際のパスを指定してください。

J2ObjC をそのソースコードのコピーからビルドした場合、_$(j2objcdistribution) が、コピーの「j2objc/dist/」ディレクトリです。このディレクトリは、make dist で J2ObjC をビルドするまで存在しません。

Xcode: ライブラリ検索パス

アプリ ターゲットのライブラリ検索パスに _$(j2objcdistribution)/lib を追加して更新します(ここでも実際のパスを使用します)。

JRE ライブラリ

これらのライブラリは、J2ObjC の JRE エミュレーションで定義されたクラスを実装します。

注: libjre_core.a ライブラリには、他のほとんどのサブセット ライブラリのクラスが含まれています。アプリのサイズを小さくするには、アプリを -l jre_core にリンクしてから、不足しているシンボルを解決するサブセット ライブラリを追加することをおすすめします。たとえば、最もよく使用される java.io クラスは libjre_core.a にあるため、名前が JavaIo で始まる未解決のシンボルエラーがある場合にのみ、libjre_io.a ライブラリを含めます。

ライブラリリンクフラグ説明
libjre_core.a -l jre_core J2ObjC の JRE エミュレーションに必要な クラスの最小セット。生成されたすべてのソースファイルから参照されます。変換後の Java ソースがネットワーキング、XML、SQL などの JRE サポートを参照している場合は、下記の追加のライブラリもリンクする必要があります。
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.concurrentjava.util.concurrent.atomicjava.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 zip ライブラリもリンクする必要があります。(SDK ライブラリを参照)。

libjre_emul.a(-l jre_emul

jre_emul ライブラリには、J2ObjC の JRE エミュレーションに含まれるすべてのクラスが含まれています。アプリが jre_emul にリンクされている場合、他の jre_* ライブラリは含めないでください。含めると、リンカーは重複シンボルエラーを報告します。これは、jre_emul にはそれらの他のライブラリで定義されたすべてのクラスが含まれているためです。

その他の J2ObjC ライブラリ

以下の Java ライブラリと Android ユーティリティ クラスは、静的ライブラリとして J2ObjC ディストリビューションに含まれています。

ライブラリリンクフラグ説明
libguava.a -l グアバ Guava: Google Core Libraries for 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 mockito -ObjC Java の単体テスト用の Mockito モック フレームワーク
libprotobuf_runtime.a -l protobuf_runtime J2ObjC アプリ向けに最適化された Google Protocol Buffer ランタイム。J2ObjC protobuf を使用するアプリでは、proto ファイルを 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 でリンクする必要があります。

いくつかのクラスを動的に読み込めるように静的ライブラリ全体をリンクするのではなく、それらのクラスを静的に参照する方法もあります。Java では、静的初期化ブロックでこれを実行できます。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
  };