2

私のアプリケーションは、次の 3 つのコンポーネントで構成されています。

  1. アプレット
  2. Java プログラム (myapp.jar)
  3. JNI ライブラリ (myjni.so)

JNI ライブラリは 32​​ ビット用に構築されていることに注意してください。32 ビット OS では、アプレットはjava.homeプロパティを使用して JRE パスを取得します。アプレットが JRE パスを取得すると、次のように JAR を起動します

JRE-path myapp.jar

ここで、このアプリケーションを 64 ビット Linux で実行する必要があります。ここで 2 つのオプションがあります。

  1. 64 ビット用の JNI ライブラリをビルドします。依存するライブラリはすべて 64 ビット用にビルドする必要があるため、これは不可能です。(これは私の最後の制約です)
  2. ユーザーに 32 ビット JVM のインストールを依頼する ここでの問題は、java.homeプロパティが 64 ビット JRE パスを提供するため、32 ビット JRE パスを取得する方法です。(ブラウザとプラグインが 64 ビットであるため)。1 つのオプションは、update-alternatives –list javaコマンドを使用してすべての JRE インストール パスを取得することです。次に、インストール パスごとにJRE-path -d32 –versionコマンドを実行して、32 ビット JVM をサポートしているかどうかを確認します。
    • 32 ビット JVM をサポートしている場合は、その JRE パスを使用して JAR ファイルを起動します。
    • どの Java インストールも 32 ビット JVM をサポートしていない場合は、32 ビット JVM をインストールするようにメッセージを表示します

質問:

  1. 上記の解決策に問題はありますか?(Ubuntu、Redhat、および OpenSuse でこのソリューションを使用する必要があります)
  2. 64ビットLinuxで32個のJREパスを取得するためのより良い解決策はありますか?
4

1 に答える 1

1

オプション 1 を使用します。32 ビットと 64 ビットの両方の JNI ライブラリをビルドし、32 ビットまたは 64 ビットの VM に基づいて、関連する .so をロードします。

sun.arch.data.modelSun JDKのシステム プロパティを使用できます。

com.ibm.vm.bitmodeを IBM websphere VM に使用できます。

64または、システム プロパティで部分文字列を探しos.archます (64 ビット Intel ベースの VM では x86_64/amd64 です)。

および.soそのすべての依存ファイルの64 ビット バリアントをビルドすることはできないため(これは、実際にはソフトウェア構成管理の優れたプラクティスです)、次のシェル スクリプトを使用することをお勧めします。呼び出しの最後にスクリプトが で終了する場合、有効な 32 ビット Java はありません。.a.so66

#!/bin/bash -p

# attempt to find a 32bit VM
# uses a dummy class file (it's just an empty file)

trap 'rm -f /tmp/testclass$$.class /tmp/jlocations.$$' EXIT HUP

touch /tmp/testclass$$.class

tryj() {
    while read java; do
        errout=$($java -cp /tmp -d32 testclass$$ 2>&1)
        if grep -q 'java.lang.ClassFormatError' <<<$errout; then
            # good VM - run with this
            rm -f /tmp/testclass$$.class /tmp/jlocations.$$
            # echo $java "$@"
            exec $java "$@"
        fi
    done </tmp/jlocations.$$
    return 1
}

# try update-alternatives - debian/ubuntu
update-alternatives --list java > /tmp/jlocations.$$ 2>/dev/null

tryj "$@"

# Try alternatives - redhat
alternatives --list java > /tmp/jlocations.$$ 2>/dev/null

tryj "$@"

# then try locate - generic linux/unix
locate java | grep 'bin/java$' > /tmp/jlocations.$$

tryj "$@"

# if we had no luck, then use find - this will be sloooooooooow
find / -wholename '*/bin/java' >/tmp/jlocations.$$ 2>/dev/null
tryj "$@"

exit 66
于 2012-05-11T11:11:21.573 に答える