2


3

Linux実行可能ファイルのライブラリの参照

Javaでアプリケーションを作成し、http://gcc.gnu.org/java/ [gcj]を使用して正常にコンパイルしました。 驚くほどうまくいきましたが、ハードルにぶつかりました。ライブラリパスを指定する必要があるため、実行可能ファイルを実行できるのはシェルスクリプトのみです。

必要なライブラリは、SWT、Xerces、およびGNU-cryptoです。

`gcj`でコンパイルするときにライブラリを静的にリンクする方法はありますか、それとも良い考えではありませんか? あるいは、コンパイル中に(相対)ライブラリパスを指定できますか?

現在、私のシェルスクリプトは次のようになっています。

#!/bin/sh
export LD_LIBRARY_PATH=./libs/:$LD_LIBRARY_PATH
exec ./MyJavaApp $*

3 Answer


3


*アイデアは、変更された値からパスを構築するように、静的フィールド「sys_paths」をnull *にすることです。 こちらの投稿をご覧ください(Post#223 by AjaySingh516)http://forums.sun.com/thread.jspa?messageID=3744346#3744346

Class clazz = ClassLoader.class;
Field field = clazz.getDeclaredField("sys_paths");
boolean accessible = field.isAccessible();
if (!accessible)
    field.setAccessible(true);
Object original = field.get(clazz);
// Reset it to null so that whenever "System.loadLibrary" is called, it
// will be reconstructed with the changed value.
field.set(clazz, null);
try {
    // Change the value and load the library.
    System.setProperty("java.library.path", "./libs/");
    System.loadLibrary("mylibapr");
} finally {
    // Revert back the changes.
    field.set(clazz, original);
    field.setAccessible(accessible);
}

.

  • gcjシステムプロパティ*(参照:libgcjでサポートされる標準プロパティ)

.

*ソリューション#2 *:コンパイル時にシステム環境変数を設定します

このためには、パラメーター「-Djava.library.path =。/ libs /」と「gcj」を使用する必要があります

  • gcjマニュアル(上記リンク)から:*

*-main = CLASSNAME *

このオプションは、結果の実行可能ファイルが実行されるときに「メイン」メソッドを呼び出す必要があるクラスの名前を指定するためにリンクするときに使用されます。

  • -Dname [= value] *

このオプションは、「-main」でのみ使用できます。 値valueを持つnameという名前のシステムプロパティを定義します。 値が指定されていない場合、デフォルトでは空の文字列になります。 これらのシステムプロパティは、プログラムの起動時に初期化され、実行時に取得できます "java.lang.System.getProperty"メソッドを使用します。

私はgcjを使用したことがありませんが、ドキュメントによると、これらのシステムプロパティは実行時に取得できるため、他のシステムにも移植可能です。


0


質問の最初の部分に答えるには-

gcjのマニュアルページから:「libgcjの静的リンクにより、libgcjの重要な部分が省略される場合があります。 libgcjの一部では、リフレクションを使用して実行時にクラスをロードします。 リンカはリンク時にこれらの参照を参照しないため、参照されるクラスを省略できます。 結果は通常(常にではないが)実行時にスローされる「ClassNotFoundException」です。 このオプションを使用するときは注意が必要です。」

他のライブラリの静的リンクについては、わかりません。 私にはそれをする理由がありません。

Linux実行可能ファイルはWindowsとは異なります。 通常、使用しているウィンドウシステムに応じて、「ランチャー」などがあります。 実行可能ファイル自体ではなく、その中にアイコンを設定します。 通常、起動スクリプトは、実行可能ファイルの実行に必要な環境を設定するために使用されます。 繰り返しますが、これはすべて、正確なデスクトップウィンドウシステムに依存します。


0


なぜAOTを使用しているのですか? http://www.excelsior-usa.com/articles/java-to-exe.html [次の記事]を読むことをお勧めします。 AOTについて言及している欠点の1つは次のとおりです…​

_ 動的なアプリケーション。 実行時にアプリケーションが動的にロードするクラスは、アプリケーション開発者が利用できない場合があります。 これらは、サードパーティのプラグイン、動的プロキシ、および実行時に生成されるその他のクラスなどです。 そのため、ランタイムシステムには、JavaバイトコードインタープリターやJITコンパイラーを含める必要があります。 _