如何在64位Linux上使用64位浏览器和64位Java插件获取32位JREpath

我的应用程序由三部分组成:

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

请注意,JNI库是为32位构build的。 在32位操作系统上,applet使用java.home属性来获取JREpath。 一旦applet获取了JREpath,它将像这样启动JAR

 JRE-path myapp.jar 

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

  1. build立64位的JNI库。 这是不可能的,因为所有依赖的库需要为64位构build。 (这是我的一个限制)
  2. 要求用户安装32位的JVM现在的问题是如何获得32位的JREpath,因为java.home属性给出了64位的JREpath。 (因为浏览器和插件是64位)。 一种select是使用update-alternatives –list java命令获取所有JRE安装path。 然后,对于每个安装path,运行JRE-path -d32 –version命令查看它是否支持32位JVM
    • 如果它支持32位JVM,则使用该JREpath启动JAR文件
    • 如果没有一个java安装支持32位JVM,则显示消息以安装32位JVM

题:

  1. 上述解决scheme有没有问题? (我需要在Ubuntu,Redhat和OpenSuse上使用这个解决scheme)
  2. 有没有更好的解决scheme,以获得64位Linux上的32 JREpath?

使用选项1.构建32位和64位JNI库,并基于在32位或64位VM上加载相关的.so。

您可以使用Sun JDK的sun.arch.data.model系统属性

您可以使用IBM websphere VM的com.ibm.vm.bitmode

或者查看os.arch系统属性中的子字符串64 (这是基于64位intel的VM上的x86_64 / amd64)

由于无法构建.so的64位版本以及依赖.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