我的应用程序由三部分组成:
请注意,JNI库是为32位构build的。 在32位操作系统上,applet使用java.home
属性来获取JREpath。 一旦applet获取了JREpath,它将像这样启动JAR
JRE-path myapp.jar
现在我需要在64位Linux上运行这个应用程序。 在这里我有两个select:
java.home
属性给出了64位的JREpath。 (因为浏览器和插件是64位)。 一种select是使用update-alternatives –list java
命令获取所有JRE安装path。 然后,对于每个安装path,运行JRE-path -d32 –version
命令查看它是否支持32位JVM
题:
使用选项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