2

我的应用程序由三个组件组成:

  1. 小程序
  2. Java 程序 (myapp.jar)
  3. JNI 库 (myjni.so)

请注意,JNI 库是为 32 位构建的。在 32 位操作系统上,小程序使用java.home属性来获取 JRE 路径。一旦小程序获得 JRE 路径,它就会像这样启动 JAR

JRE-path myapp.jar

现在我需要在 64 位 Linux 上运行这个应用程序。在这里,我有两个选择:

  1. 为 64 位构建 JNI 库。这是不可能的,因为所有依赖的库都需要为 64 位构建。(这是我最后的一个约束)
  2. 要求用户安装 32 位 JVM 现在的问题是如何获取 32 位 JRE 路径,因为java.home属性给出了 64 位 JRE 路径。(因为浏览器和插件都是 64 位的)。一种选择是使用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.bitmodeIBM websphere VM

或者64os.arch系统属性中查找子字符串(它是基于 64 位英特尔的 VM 上的 x86_64/amd64)

由于您无法构建 64 位变体.so及其所有依赖.a.so文件(这实际上是很好的软件配置管理实践),因此以下 shell 脚本应该是一个很好的努力。如果在调用它结束时脚本以 退出66,则没有有效的 32 位 java

#!/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 回答