必要なリンク設定

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

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」になります。

重要: プロジェクトで _$(j2objcdistribution) を実際に使用しないでください。常に 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 にあります。 そのため、未解決のシンボルエラーがある場合にのみ libjre_io.a ライブラリを含めます。 名前は JavaIo で始まるものになります。

ライブラリリンクフラグ説明
libjre_core.a -l jre_core <ph type="x-smartling-placeholder"></ph> クラスの最小セットは J2ObjC の JRE エミュレーションに必須で、 表示できます。変換された Java ソースが JRE サポートを参照している場合 ネットワーキング、XML、SQL などの場合は追加のライブラリ(下記) リンクも必要になります
libjre_beans.a -l jre_beans <ph type="x-smartling-placeholder"></ph> すべてのクラス java.beans パッケージから。すべての Java Beans クラスが 含まれている。
libjre_channels.a -l jre_channels <ph type="x-smartling-placeholder"></ph> 複数のクラス java.nio.channelsjava.nio.channels.spiから 提供します。
libjre_concurrent.a -l jre_concurrent <ph type="x-smartling-placeholder"></ph> 複数のクラス 出発駅: java.util.concurrentjava.util.concurrent.atomic および java.util.concurrent.locks パッケージ。
libjre_icu.a -l jre_icu <ph type="x-smartling-placeholder"></ph> 複数のクラス android.icu からタイムゾーンをサポート(主に java.time など)。
libjre_io.a -l jre_io <ph type="x-smartling-placeholder"></ph> (使用頻度の低い)複数のクラス java.io パッケージから。
libjre_net.a -l jre_net <ph type="x-smartling-placeholder"></ph> 複数のクラス java.net パッケージ。ただし、java.net.URLClassLoader クラスは jre_security にあり、javax.netjavax.net.ssl クラスは jre_ssl にあります。
libjre_security.a -l jre_security <ph type="x-smartling-placeholder"></ph> ほとんどのクラス java.security パッケージ(一部は jre_core にある)、 java.security.* 内のクラスと同様に、 javax.crypto.* パッケージと javax.security.* パッケージ。 リンクする場合は、iOS セキュリティ フレームワークもリンクする必要があります。 (SDK ライブラリをご覧ください)。
libjre_sql.a -l jre_sql <ph type="x-smartling-placeholder"></ph> すべてのクラス java.sql パッケージ。
libjre_ssl.a -l jre_ssl <ph type="x-smartling-placeholder"></ph> すべてのクラス javax.net パッケージと javax.net.ssl パッケージ。
libjre_time.a -l jre_time <ph type="x-smartling-placeholder"></ph> すべてのクラス java.time パッケージ。
libjre_util.a -l jre_util <ph type="x-smartling-placeholder"></ph> 複数のクラス java.util パッケージのものと、 java.util.logging パッケージ。ほとんどの java.util クラス ただし、jre_core にあるため、このライブラリが含まれているのは 未解決の JavaUtil* シンボルエラーです (JavaUtilConcurrent* 個の記号が jre_concurrent ライブラリを参照)。
libjre_xml.a -l jre_xml <ph type="x-smartling-placeholder"></ph> すべてのクラス XML 関連パッケージ(javax.xml.*org.w3c.dom.*org.xml.sax.*
libjre_zip.a -l jre_zip <ph type="x-smartling-placeholder"></ph> すべてのクラス 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: Java 用 Google コアライブラリ
libjavax_inject.a -l javax_inject JSR-330 依存関係インジェクション アノテーション ライブラリを使用します。
libjson.a -l JSON JSON データ交換ライブラリ。 これが <ph type="x-smartling-placeholder"></ph> JSON の Android バージョンです。他の実装とは若干異なります。
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 Google プロトコル バッファ 最適化され、J2ObjC アプリ向けに最適化されています。J2ObjC プロトコル バッファを使用するアプリでは、プロトコルをコンパイルする必要があります。 を j2objc_protoc で提供しています。
libandroid_util.a -l android_util `android_util` ライブラリには、Android API ユーティリティ クラスの小さなサブセットが含まれています。 Android 環境用のエミュレーションを提供するものではなく、共有するための手段にすぎません。 便利なクラスが用意されています。

-ObjC フラグは、iOS アプリをリンクするときによく使用されますが、 C のクラスとカテゴリは、静的ライブラリから動的に読み込む必要があります。このフラグを使用すると、 すべてのリンクされた静的ライブラリのクラスをアプリに含める。 分析できますそのため、J2ObjC を使用するアプリは、-ObjC フラグでリンクするのが クラスの読み込みに失敗します(症状の 1 つは JavaLangClassNotFoundException がスローされる場合です)。

JUnit と Mockito のテスト フレームワークはリフレクションに大きく依存しているため、これらを使用するテストアプリはリフレクションを使用する必要があります。 -ObjC でリンクします。

静的ライブラリ全体をリンクして少数のクラスを動的に読み込めるようにする代わりに、 静的に参照することもできます。Java では、これは静的イニシャライザで実行できます。 block;J2ObjC の 1 つの例を 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
  };