2

Java でアプリケーションを作成し、gcjを使用して正常にコンパイルしました。驚くほどうまく機能しましたが、ハードルにぶつかりました。ライブラリ パスを指定する必要があるため、シェル スクリプトを介してしか実行可能ファイルを実行できません。

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

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

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

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

3 に答える 3

3

アイデアは、静的フィールド「sys_paths」を nullにして、変更された値からパスを構築することです。こちらの投稿を参照してください (AjaySingh516 による投稿 #223) 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 でサポートされる標準プロパティ)

http://gcc.gnu.org/onlinedocs/gcj/System-properties.html

.

解決策 2 : コンパイル時にシステム環境変数を設定する

http://linux.die.net/man/1/gcj

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

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

--main= クラス名

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

-Dname[=値]

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

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

参照: http://gcc.gnu.org/wiki/Statically_linking_libgcj?action=show&redirect=Statically+linking+libgcj

于 2010-01-27T23:34:22.393 に答える
0

なぜAOTを使用しているのですか?次の記事を読むことをお勧めします。AOTについて言及している欠点の1つは、次のとおりです...

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

于 2010-01-20T15:50:54.407 に答える
0

あなたの質問の最初の部分に答えるために-

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

他のライブラリの静的リンクについては、よくわかりません。私にはそうする理由がありませんでした。

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

于 2010-01-20T15:47:33.850 に答える