2012-05-11 124 views
2

我的應用程序由三個部分組成:如何獲得32位JRE路徑上64位Linux 64位瀏覽器和64位Java插件

  1. Applet的
  2. Java程序(myapp.jar)
  3. JNI庫(myjni.so)

請注意,JNI庫是爲32位構建的。在32位操作系統上,小程序使用java.home屬性來獲取JRE路徑。一旦applet獲得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. 是否有上述任何溶膠問題ution? (我需要在Ubuntu,Redhat和OpenSuse上使用此解決方案)
  2. 是否有更好的解決方案在64位Linux上獲得32 JRE路徑?
+0

你如何推動本地庫到客戶端?我想你的applet是用一個可信的證書籤名的,對嗎? – home

+0

是小程序使用可信證書籤名。使用java傳送機制將本地lib推送到客戶端 – user345794

回答

1

使用選項1.構建一個32位和64位JNI庫,並根據位於32位或64位VM上加載相關的.so。

可以使用sun.arch.data.model系統屬性爲Sun JDK

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

還是在os.arch系統屬性查找子64(它的x86_64的/ AMD64上64位基於Intel的虛擬機)

正如你不能建立.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 "[email protected]" 
      exec $java "[email protected]" 
     fi 
    done </tmp/jlocations.$$ 
    return 1 
} 

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

tryj "[email protected]" 

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

tryj "[email protected]" 

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

tryj "[email protected]" 

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

exit 66 
+0

不能使用選項1。這是因爲myjni.so依賴於其他一些靜態和共享庫。所以我需要編譯64位的模塊。再次,這些模塊另一套庫等。總之,我需要建立64位整個堆棧。 – user345794

+0

然後選項1不是一個真正的選擇。在我的ubuntu系統中,我甚至沒有選擇安裝jre的32位版本 - 我必須手動安裝它,這意味着它不會出現在'update-alternatives'輸出中。我將添加一個選項,該選項使用了一個利用'locate'來查找java副本的shell腳本,並且無法回退到使用find – Petesh