2

JNI を使用する場合、bash/cmd で次のようにします。

  1. ソースをコンパイルする
  2. ヘッダーを生成する
  3. ネイティブ ライブラリをビルドする
  4. 全体を圧縮する

スクリプトでは、次のようになります。

javac foo.java
javah foo
cmake . && make
jar .....

CMakeで再現するにはどうすればよいですか?

CUSTOM_COMMAND を使用する以外に、java ソースをコンパイルするための add_jar しか見つかりませんでした。後でそれらをjarすることなく、CMakeでソースをコンパイルすることは可能ですか?

または、辞任してJavaソースをadd_jarし、ライブラリをビルドしてadd_jarを再度作成する必要がありますか?

また、Java_JAVAH_EXECUTABLE は CUSTOM_COMMAND でどのように使用されるのですか?

4

1 に答える 1

2

私はこのようなことを達成しようとしているプロジェクトを持っています。(そして、一部の Android NDK は android-cmake を使用して動作しますが、成功は限られていますが、それはあなたの質問のポイントではありません。)

CMake は、Java を構築するためのオプションをサポートしています。[注 1 を参照] しかし、それはまさにその方向性です: このビルド システムに関する限り、ネイティブ コードは第一級市民です。CMake を Java ワークフローのコンポーネントとして、 ant/maven またはその性質のものの下で使用する人もいます。「より大きな」ビルドの範囲内で CMake プロジェクトをロードするさまざまなプラグインがあります。

しかし、これは CMake のジェネレーターの価値を本当に阻害していると思います。そうして調べたのですが、結局そのルートには行きませんでした。それは本当にあなたが自分でしなければならない選択です。(このプロジェクトにはJavaではなくJava含まれていることがわかりました。そのため、あなたが求めているようなことをするのは理にかなっています。)

ここに問題があります: add_jar には、ちょっとしたブラックボックスの魔法があります。UseJNI を統合したい場合は...まあ、それをサポートする方法はあまり見つかりませんでした。(CMake 2.8.x に含まれるモジュールのソースを読むと、CMAKE_JNI_TARGET のようなものが公開されます。実際に機能することはありませんでしたが、とにかく含めました。この問題に対する私のカスタム ソリューションは次のとおりです。

Java を使用するプロジェクトのトップレベル CMakeLists.txt に適したもの

役立つマクロの定義が含まれています: javah

ネイティブ ライブラリでマクロを使用する方法のサンプル

[1] この記事の執筆時点では、次の 2 つの方法があるようです。

  • project(PROJECT_NAME Java) を介して、汎用 Java コンパイラを見つける必要があることを CMake に通知します。
  • find_package({Java, JNI}) は、add_jar を含むもう少し多くの機能を公開します。

これは、私がかなり参照していることに気付いた後者の参照です。

幸運を。

于 2013-03-29T02:01:38.430 に答える