如何使用 64 位浏览器和 64 位 java 插件在 64 位 Linux 上获取 32 位 JRE 路径

     2023-03-23     151

关键词:

【中文标题】如何使用 64 位浏览器和 64 位 java 插件在 64 位 Linux 上获取 32 位 JRE 路径【英文标题】:How to get 32 bit JRE path on 64 bit Linux with 64 bit browser and 64 bit java plugin 【发布时间】:2012-05-19 19:29:30 【问题描述】:

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

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

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

JRE-path myapp.jar

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

    为 64 位构建 JNI 库。 这是不可能的,因为所有依赖的库都需要为 64 位构建。 (这是我最后的一个约束) 要求用户安装 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 的消息

问题:

    上述解决方案有问题吗? (我需要在 Ubuntu、Redhat 和 OpenSuse 上使用这个解决方案) 在 64 位 Linux 上获取 32 个 JRE 路径是否有更好的解决方案?

【问题讨论】:

如何将原生库推送给客户端?我想你的小程序是用受信任的证书签名的,对吗? 是的,小程序是用受信任的证书签名的。 Native lib 使用 java 传递机制推送到客户端 【参考方案1】:

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

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

您可以将com.ibm.vm.bitmode 用于 IBM websphere VM

或在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

【讨论】:

无法使用选项 1。这是因为 myjni.so 依赖于其他一些静态和共享库。所以我需要为64位编译so模块。这些模块又是另一组库等。简而言之,我需要为 64 位构建整个堆栈。 那么选项 1 并不是一个真正的选项。在我的 ubuntu 系统上,我什至没有安装 jre 的 32 位变体的选项 - 我必须手动安装它,这意味着它不会出现在 update-alternatives 输出中。我将在答案中添加一个选项,该选项使用 shell 脚本,利用 locate 尝试查找 java 的副本,如果失败则回退到使用 find

如何同时支持32位和64位组件自动安装

weboffice论坛ActiveX可以通过浏览器自动从服务器安装到客户端,但是IE目前有32位版本和64位版本,对应的ActiveX也分为32位版本和64位版本;由于是两个版本的两个不同的ocx或者dll,如何同一套代码实现自动识别浏览器安装对应的版... 查看详情

如何在 64 位应用程序中使用 32 位指针?

】如何在64位应用程序中使用32位指针?【英文标题】:Howtouse32-bitpointersin64-bitapplication?【发布时间】:2012-04-2210:45:02【问题描述】:我们学校的项目只允许我们将c程序编译成64位应用程序,他们会测试我们的程序的速度和内存... 查看详情

启动 Java 时使用 -d32 和 -d64

...9-1317:45:03【问题描述】:我阅读了以下来自JDKFAQ\'s的摘录如何在32位和64位操作之间进行选择?默认是什么?选项-d32和-d64已添加到Java启动器中以指定程序是以32位还是64位运行环境。在Solaris上,这些对应于ILP32和LP64数据模型,分... 查看详情

如何在 64 位 Windows 计算机上安装 rJava 以与 64 位 R 一起使用?

】如何在64位Windows计算机上安装rJava以与64位R一起使用?【英文标题】:HowcanIinstallrJavaforusewith64bitRona64bitWindowscomputer?【发布时间】:2012-02-0221:27:55【问题描述】:我安装了iplots和rjava包。当我执行此库(iplots)时,出现以下错误... 查看详情

如何根据浏览器在同一页面上嵌入 32 位或 64 位 ActiveX 控件?

】如何根据浏览器在同一页面上嵌入32位或64位ActiveX控件?【英文标题】:Howtoembed32or64bitActiveXcontrolonsamepagedependingonbrowser?【发布时间】:2011-03-2216:34:41【问题描述】:我有一个ActiveX控件,它具有32位和64位版本,适用于32位和64... 查看详情

如何查找 java.exe 是 32 位还是 64 位?

】如何查找java.exe是32位还是64位?【英文标题】:Howtofindifjava.exeis32-bitor64-bit?【发布时间】:2017-09-1306:21:34【问题描述】:我有一台装有Windows7Professional64位操作系统的笔记本电脑。它有一个C:\\ProgramData\\Oracle\\Java\\javapath文件夹... 查看详情

如何根据目标机器(32 位或 64 位)有条件地使用 WiX 安装文件?

】如何根据目标机器(32位或64位)有条件地使用WiX安装文件?【英文标题】:HowdoIconditionallyinstallafilewithWiXbasedonthetargetmachine(32bitor64bit)?【发布时间】:2010-10-1808:22:11【问题描述】:我有一个有32位版本和64位版本的文件。如果我... 查看详情

ubuntu如何下载64位intel

不同的linux发现版厂商习惯性命名64位的方式不一样:ubuntu习惯上称64位为“amd64”fedora习惯上称64位架构为“x86_64”由于AMD64和Intel64基本上一致,很多软硬件产品都使用一种不倾向任何一方的词汇来表明它们对两种架构的... 查看详情

ubuntu如何下载64位intel

不同的linux发现版厂商习惯性命名64位的方式不一样:ubuntu习惯上称64位为“amd64”fedora习惯上称64位架构为“x86_64”由于AMD64和Intel64基本上一致,很多软硬件产品都使用一种不倾向任何一方的词汇来表明它们对两种架构的... 查看详情

如何知道java虚拟机jvm是64位jvm还是32位?-break易站(代码片段)

[第一种确定Java虚拟机JVM是64位JVM还是32位的方法Sun有一个Java系统属性来确定JVM的位数:32或64:sun.arch.data.model=32//32bitJVMsun.arch.data.model=64//64bitJVM您可以使用System.getProperty("sun.arch.data.model")以确定它是否来自程序的32/64。第二种确... 查看详情

如何从 32 位进程启动 64 位进程

】如何从32位进程启动64位进程【英文标题】:Howtostarta64-bitprocessfroma32-bitprocess【发布时间】:2011-01-0111:50:30【问题描述】:我正在尝试从我们的32位.NET应用程序运行64位可执行文件(java.exe)。我正在使用Process类并调用cmd/c&lt;com... 查看详情

jdk_如何查看安装的jdk是32位还是64位?

1、  1.1、32位系统只能装32位jdk  1.2、64位系统,安装的32位JDK和64位JDK是不同的目录    1.2.1、32位的路径类似:C:ProgramFiles(x86)Javajdk1.7.0_25    1.2.2、64位的路径??? 2、命令:"java-d??-version"  我的机子Win7x64,安... 查看详情

如何测量 32 位程序中 64 位进程的内存使用情况?

】如何测量32位程序中64位进程的内存使用情况?【英文标题】:HowcanImeasurememoryusageof64-bitprocessin32-bitprogram?【发布时间】:2017-01-2310:36:38【问题描述】:我正在尝试从C++中的32位进程测量64位应用程序的进程内存使用情况(WorkingSet... 查看详情

如何使用 Expo CLI 为 android 构建 64 位本机代码

】如何使用ExpoCLI为android构建64位本机代码【英文标题】:HowtoBuild64-bitnativecodeforandroidusingExpoCLI【发布时间】:2019-09-2117:24:02【问题描述】:我正在使用react-native和EXPOCLI来构建androidapk文件。但我无法上传到Play商店。我收到一条... 查看详情

32位、64位系统和x86、x64是啥!

...么!简单的说x86代表32位作业系统x64代表64位作业系统。如何判断电脑是否支援64位作业系统?64位的windows7释出,很多朋友想知道自己电脑是否支援64位的系统!首先从一个常理来说,如果你的CPU是双核,应该是支援64位的了!当... 查看详情

64 位 Java 的最大内存

...地系统上的内存和交换空间的限制:在64位VM上,您可以使用64位可寻址性,从而导致最大Java堆大小仅受系统提供 查看详情

如何使用 Visual c++ 2008 编译 64 位

】如何使用Visualc++2008编译64位【英文标题】:HowcanIcompile64bitwithvisualc++2008【发布时间】:2012-03-0215:58:21【问题描述】:使用visualc++2008express版,如何编译64位程序?【问题讨论】:Howtocompilea64-bitapplicationusingVisualC++2010Express?的可能... 查看详情

32位和Java中的64位JDBC同时

...BC驱动程序和javax64中的64位ODBC驱动程序,但是如果我需要使用64位ODBC驱动程 查看详情