gpt4 book ai didi

java - 将 Java 运行时嵌入到沙盒 Cocoa Mac 应用程序中

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:08 25 4
gpt4 key购买 nike

有人知道如何将 Java 运行时嵌入到 Mac Cocoa(沙盒)应用程序中,以便该应用程序可以运行 .jar 文件而无需用户单独安装 Java 吗?

我们有一个 Cocoa 应用程序,我们通过 Mac App Store 以及在我们自己的网站上销售它可以使用 Java 来完成特定任务。这是一个写作应用程序,因为 .doc、.docx 和 .odt 的标准 NSText 导出器非常有限(不支持页眉、页脚、图像等),我们将其写入 RTF,然后使用基于 Java 的转换器(来自 Aspose。 com) 将 RTF 转换为 .doc、.docx 或 .odt,具体取决于所选的导出格式。

我通过使用 NSTask 调用/usr/bin/java 并运行一个运行转换例程的捆绑 .jar 文件来实现这一点。这一切工作得很好——只要用户的 Mac 上安装了 Java。如果未安装,我们的应用程序会询问用户是否愿意安装 Java 以从增强型转换器中受益,或者转而使用 NSText 有损转换器。如果用户选择安装 Java,我们调用 java_home --request 来调用 OS X 的 Java 安装程序。

但是,既然 Apple 已经结束(或即将结束)对 Java 的直接支持,这种做法就存在问题了。在我们上一次 Mac App Store 审查期间,我们被告知我们很快就需要停止询问用户是否要安装 Java。我读过 Apple 推荐的前进路线是将 Java 运行时环境嵌入到需要运行 Java 的 Cocoa 应用程序中。 (例如:http://lists.apple.com/archives/java-dev/2011/Jul/msg00038.html)

因此,在过去的几天里,我一直在研究如何在我的应用程序中嵌入 JRE,但我没有在任何地方找到任何关于如何这样做的说明 - 至少我不了解。几年前有人在这里问过类似的问题:

Bundling a private JRE on Mac OS X

但是,那里以及我在其他网站上找到的答案都是关于将 Java 应用程序捆绑为 Mac 应用程序,而不是关于将 JRE 包含在现有的 Cocoa 应用程序中。 (虽然我承认我缺乏 Java 经验可能意味着我只是不明白如何为我的目的转换指令 - 让我离开 Xcode,我就离开了我的舒适区。)同样:https://wikis.oracle.com/display/OpenJDK/How+to+embed+a+.jre+bundle+in+your+Mac+app

似乎有几个应用程序已经做到了这一点(例如 Cyber​​duck),但还没有人记录这个过程。根据我的阅读,我认为我需要从 Oracle 的 JDK 或 OpenJDK 中获取 Java 虚拟机并将其包含在我的 Cocoa 应用程序中并从中调用 java,但如果我这样做了,JVM 副本中的 Java 可执行文件不会被沙盒化,因此我的应用程序无法通过 MAS 审查流程。所以大概我需要以某种方式构建 JDK 的副本并将其沙箱化,很可能作为我更大的 Xcode 项目的一部分?我什至不知道从哪里开始;我猜现在还为时尚早,而且还没有多少 Mac 开发人员必须这样做。

有没有人有过将 JRE 嵌入 Cocoa 应用程序的经验,这样应用程序就可以使用 NSTask 调用它?并以 JRE 完全沙盒化并因此被 Mac App Store 接受的方式?或者,有没有人成功创建了一个运行 .jar 文件而无需单独安装 Java 的沙盒 Cocoa 应用程序?如果是这样,您愿意分享您是如何做到的吗?

(我向 Apple 提出了开发人员技术支持事件,就此寻求帮助,但被告知鉴于 Java 现在被视为第三方开发环境,他们根本无能为力。)

非常感谢您提供我可能错过的网页的任何建议或指示。

最佳答案

我不能确定,但​​我强烈怀疑当那个 Apple 工程师说他们建议“嵌入”Java 运行时时,他的意思并不是“将单独的可执行文件捆绑到您的应用程序包中并在单独的进程中运行它” 他的意思是“在您自己的进程中启动一个 Java VM,并在该 VM 中运行您需要的东西。”可以说,这样做比在单独的进程中运行 Java 更麻烦,但这是可能的。

看看 NSJavaVirtualMachine 类。如果用户没有安装 Java,它可能对你没有帮助,但想法是一样的——你只需构建一个包含 Java 运行时的库,将它链接到你的主二进制文件,然后使用创建和管理 JVM JNI API。 Google JNI_CreateJavaVM

我在另一个问题 (Calling a Java class function from Cocoa with JNI) 中给出了一个假脱机 JVM 并使用 JNI 调用 Java 的快速示例,尽管这是基于使用 Apple 捆绑的 JavaVM.framework,因此它不包括以下步骤构建您需要链接的库。不幸的是,我对此没有任何经验。

关于java - 将 Java 运行时嵌入到沙盒 Cocoa Mac 应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16960662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com