ほとんどの Xcode プロジェクト タイプではビルドルールがサポートされています。これにより、デベロッパーは既存のファイル形式のビルド方法を変更したり、新しいファイル形式のビルド方法を定義したりできます。J2ObjC スクリプトは、Xcode のようなビルドシステムに接続するように意図的に設計されています。
j2objc-sample-reversi プロジェクトは、単純な iOS ゲームに Java ソースを追加する方法の例です。
最小限のビルドを行うには、ビルド設定を更新してから、J2ObjC ビルドルールを追加する必要があります。
ビルド設定の更新
- プロジェクト ナビゲータでプロジェクトをクリックしてプロジェクト エディタを開き、アプリケーションのターゲットが選択されていることを確認します。
- [Build Settings] タブをクリックします。
- [Other Linker Flags] に
-ljre_emul
を追加して、JRE エミュレーション ライブラリ(jre_emul
)をリンクします。 設定は次のようになっているはずです。 - [+] をクリックして [ユーザー定義の設定を追加] を選択します。
- この設定に
J2OBJC_HOME
という名前を付け、その値を J2ObjC のロケーションに設定します。これは、リリース zip を解凍したフォルダ、またはソースからコンパイルしルートがj2objc
の場合はj2objc/dist
フォルダのいずれかです。 - [検索パス] で次のように変更します。
- フレームワーク検索パスには
${J2OBJC_HOME}/frameworks
を追加します。 - ライブラリ検索パスに、(ビルド構成ごとに)
${J2OBJC_HOME}/lib
を追加します。 - ユーザー ヘッダー検索パスに
${J2OBJC_HOME}/include
を追加します。
- フレームワーク検索パスには
- 「
J2OBJC_HOME
」を検索して設定を確認してください。次のように表示されます。
J2ObjC ビルドルールの追加
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 プロジェクトの外部にある場合は、ターミナル ウィンドウにリストする際に使用するフルパスを入力します。
プロジェクト ナビゲータでプロジェクトをクリックしてプロジェクト エディタを開き、アプリケーションのターゲットが選択されていることを確認します。
[Build Rules] タブをクリックします。
[+] をクリックしてビルドルールを追加します。
新しいルールの [Process] オプションで [Java source files] を選択します。[使用] オプションは [Custom script:] になっているはずです。
カスタム スクリプトのテキスト ボックスに、以下を追加します(
$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};
[出力ファイル] パネルで、[+] ボタンをクリックして
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.h
を追加します。もう一度 [+] ボタンをクリックし、
${DERIVED_FILE_DIR}/${INPUT_FILE_BASE}.m
を追加します。
完了すると、設定パネルは次のようになります(注: 10.2 の時点で、Xcode は下位互換性を確保するため、DERIVED_FILES_DIR 変数を DERIVED_FILE_DIR と同じ変数として定義しています)。
追加のライブラリをリンクする
リンクビルド ステップ(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 グループでお問い合わせください。