Xcode ビルドルール

ほとんどの Xcode プロジェクト タイプではビルドルールがサポートされています。これにより、デベロッパーは既存のファイル形式のビルド方法を変更したり、新しいファイル形式のビルド方法を定義したりできます。J2ObjC スクリプトは、Xcode のようなビルドシステムに接続するように意図的に設計されています。

j2objc-sample-reversi プロジェクトは、単純な iOS ゲームに Java ソースを追加する方法の例です。

最小限のビルドを行うには、ビルド設定を更新してから、J2ObjC ビルドルールを追加する必要があります。

ビルド設定の更新

  1. プロジェクト ナビゲータでプロジェクトをクリックしてプロジェクト エディタを開き、アプリケーションのターゲットが選択されていることを確認します。
  2. [Build Settings] タブをクリックします。
  3. [Other Linker Flags] に -ljre_emul を追加して、JRE エミュレーション ライブラリ(jre_emul)をリンクします。 設定は次のようになっているはずです。 Xcode で JRE エミュレーション ライブラリをリンクする
  4. [+] をクリックして [ユーザー定義の設定を追加] を選択します。
  5. この設定に J2OBJC_HOME という名前を付け、その値を J2ObjC のロケーションに設定します。これは、リリース zip を解凍したフォルダ、またはソースからコンパイルしルートが j2objc の場合は j2objc/dist フォルダのいずれかです。
  6. [検索パス] で次のように変更します。
    • フレームワーク検索パスには ${J2OBJC_HOME}/frameworks を追加します。
    • ライブラリ検索パスに、(ビルド構成ごとに)${J2OBJC_HOME}/lib を追加します。
    • ユーザー ヘッダー検索パス${J2OBJC_HOME}/include を追加します。
  7. J2OBJC_HOME」を検索して設定を確認してください。次のように表示されます。 Xcode ビルド設定

J2ObjC ビルドルールの追加

  1. Java ソースファイルのルート ディレクトリを特定します。ここでは、$source-root を呼び出します。ルート ディレクトリは、ソースファイルの最上位パッケージを含むディレクトリです。

    • git を使用していて、別の git プロジェクトから Java ファイルを pull する場合は、Java ソースでプロジェクトを追跡するサブモジュールを追加できます。たとえば、Xcode プロジェクト(xcodeproj)が ~/dev/MyProject にある場合、Objective-C ソースを含む別の MyProject ディレクトリが存在する可能性があります。~/dev/MyProject/MyProject ディレクトリで git submodule add git@github.com:user/javaproject を実行し、Objective-C ソースの横に Java プロジェクトのソースが入った ~/dev/MyProject/MyProject/javaproject ディレクトリを作成します。このフォルダを、Xcode がファイル システムをミラーリングしている MyProject グループの Xcode プロジェクトにドラッグできます。${PROJECT_DIR}/MyProject/javaproject/src$source-root です。

    • Java ソースが Xcode プロジェクトのグループまたはディレクトリにある場合、$source-root${PROJECT_DIR}/__group_or_directory_name__ です。

    • 疑わしい場合は、そのグループまたはディレクトリを右クリックして [Finder に表示] を選択してディレクトリを表示し、絶対パスを使用します。

    • たとえば、~/myproject/src というディレクトリに Java パッケージ foo.bar がある場合、そのパッケージの Java ファイルは ~/myproject/src/foo/bar/**.java に存在する必要があります。つまり、~/myproject/src がプロジェクトのルート ディレクトリになります。

    • Java ソースファイルが Xcode プロジェクトの外部にある場合は、ターミナル ウィンドウにリストする際に使用するフルパスを入力します。

  2. プロジェクト ナビゲータでプロジェクトをクリックしてプロジェクト エディタを開き、アプリケーションのターゲットが選択されていることを確認します。

  3. [Build Rules] タブをクリックします。

  4. [+] をクリックしてビルドルールを追加します。

  5. 新しいルールの [Process] オプションで [Java source files] を選択します。[使用] オプションは [Custom script:] になっているはずです。

  6. カスタム スクリプトのテキスト ボックスに、以下を追加します($source-root は置き換えてください)。

    if [ ! -f "${J2OBJC_HOME}/j2objc" ]; then echo "J2OBJC_HOME is not correctly defined, currently set to '${J2OBJC_HOME}'"; exit 1; fi;
    "${J2OBJC_HOME}/j2objc" -d ${DERIVED_FILE_DIR} -sourcepath "$source-root" --no-package-directories -g ${INPUT_FILE_PATH};
    
  7. [出力ファイル] パネルで、[+] ボタンをクリックして ${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h を追加します。

  8. もう一度 [+] ボタンをクリックし、${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m を追加します。

完了すると、設定パネルは次のようになります(注: 10.2 の時点で、Xcode は下位互換性を確保するため、DERIVED_FILES_DIR 変数を DERIVED_FILE_DIR と同じ変数として定義しています)。

Xcode ビルドルール

追加のライブラリをリンクする

リンクビルド ステップ(Xcode の「Link Binary With Libraries」ビルドフェーズ)には、J2ObjC 固有のフラグが必要です。これは、アプリケーションで変換された Java クラスの使用方法によって異なります。完全なリストについては、必要なリンク設定をご覧ください。リンクする必要のある追加ライブラリの例を以下に示します。

  • java.util.zip パッケージを使用するには、-ljre_zipその他のリンカーフラグに追加して、libz.dylib ライブラリをリンクする必要があります。
  • セキュアなハッシュを生成するには、プロジェクトにセキュリティ フレームワークを追加する必要があります。

ビルドの問題をデバッグする

上記のステップで Xcode がビルドの失敗を報告した場合は、Issue Navigator を開き、エラーをクリックして詳細を確認します。これにより、実行されたコマンドライン ステートメントの詳細が表示されます。一般的なエラーは次のとおりです。

  • クラスを解決できません - 使用された $source-path が正しくない可能性があります。実行されたコマンドで -sourcepath オプションを探し、Java ソースファイルのルート ディレクトリを指していることを確認します。

  • 「JreEmulation.h」ファイルが見つからない - ほとんどの場合、User Header Search Paths の値が正しくない可能性があります。ビルドコマンドでパスを指定して -I オプションを検索します。問題がなければ(-I ではなく)パスをコピーし、ターミナル ウィンドウで ls を実行して、そのパスに入力ミスがないことを確認します。

  • "_IOSClass_FromClass", reference from: または "_OBJCCLASS$_Java" - Library Search Paths が正しくないか、Other Linker Flags-ljre_emul に設定して JRE エミュレーション ライブラリをリンクするのを忘れています。追加のライブラリのリンクが必要になることもあります。

  • 未定義のシンボル: _iconv* - 必要な iconv ライブラリ内のリンク。

それでも問題が解決しない場合は、j2objc-discuss グループでお問い合わせください。