リンクビルド ステップ(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.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 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 リンクフラグ
-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
};