java - 通过 JWS 部署的 Applet 在 JNA 中使用 native 库的正确方法(java web start)

标签 java applet native jna java-web-start

我正在使用通过 JWS (Java Web Start) 部署的小程序。该小程序具有一些 native 功能,包括:JNA。 User32、Kernel32 和 Gdi32。当我通过 JWS 启动小程序时,我得到以下信息:

basic: LD - All JAR files signed: file:/C:/JavaApplication6/dist/launch.jnlp
basic: passing security checks; secureArgs:false, allSigned:false
basic: continuing launch in this VM
network: LDUpdater: started background update check
basic: JNLP2ClassLoader.findClass: winToJnaApi.NewApplet: try again ..
basic: JNLP2ClassLoader.getPermissions() ..
basic: Plugin2ClassLoader.getPermissions CeilingPolicy allPerms
security: JAVAWS AppPolicy Permission requested for: file:/C:/JavaApplication6/dist/JavaApplication6.jar
basic: JNLP2ClassLoader.getPermissions() X
basic: Applet loaded.
basic: Applet resized and added to parent container
basic: PERF: AppletExecutionRunnable - applet.init() BEGIN ; jvmLaunch dt 194323 us, pluginInit dt 462062 us, TotalTime: 656385 us
basic: JNLP2ClassLoader.findClass: winToJnaApi.APIManipulation: try again ..
basic: JNLP2ClassLoader.findClass: winToJnaApi.User32Extended: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.win32.StdCallLibrary$StdCallCallback: try again ..
basic: JNLP2ClassLoader.getPermissions() ..
basic: Plugin2ClassLoader.getPermissions CeilingPolicy allPerms
security: JAVAWS AppPolicy Permission requested for: file:/C:/JavaApplication6/dist/lib/jna.jar
basic: JNLP2ClassLoader.getPermissions() X
basic: JNLP2ClassLoader.findClass: com.sun.jna.Callback: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.win32.StdCall: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.AltCallingConvention: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.Library: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.Native: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.Callback$UncaughtExceptionHandler: try again ..
basic: JNLP2ClassLoader.findClass: com.sun.jna.Native$3: try again ..

这很奇怪,对吗?如果我用 jarsigner 检查我的 jar,它们似乎都已签名(我使用 Netbeans 自动签名,但即使我手动签名也不起作用)。由于我对小程序和 JWS 技术相当陌生,我想知道重试是否意味着 JNLP 找不到合适的类。

更奇怪的是,如果我在小程序中定义一个 native 方法,例如单击小程序上的按钮后会给出一个 Windows 消息框的方法,如果我单击小程序上的按钮,它就会起作用,但如果我尝试通过 javascript 调用相同的函数,它就会失败。这是我的 .jnlp 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <jnlp codebase="file:/C:/JavaApplication6/dist/" href="launch.jnlp" spec="1.0+">
        <information>
            <title>JavaApplication6</title>
            <description>blalbla</description>
            <description kind="short">JavaApplication6</description>

        </information>
    <update check="background"/>
    <security>
    <all-permissions/>
    </security>
        <resources>
    <j2se java-vm-args="-Djava.security.policy=applet.policy" version="1.5+"/>
    <jar href="JavaApplication6.jar" main="true"/>


        <jar href="lib/jna.jar"/>
    <jar href="lib/platform.jar"/>
    </resources>
        <applet-desc height="300" main-class="winToJnaApi.NewApplet" name="JavaApplication6" width="300">

        </applet-desc>
    </jnlp>

根据一些信息,我发现我应该将 jna.jar 的 user32_x86 目录转换为自己的 jar 并将其作为 nativelib href 包含在我的 jnlp 中,但它不起作用。此外,尝试使用 doPrivileged 包装对小程序中 native 函数的每个调用也不起作用。

如有任何帮助,我们将不胜感激

最佳答案

我确实设法摆脱了重试消息。

问题是,如果 JWS 的存档和/或代码库 jar 没有由同一机构签名,那么 JWS 就会出现一些问题。对我来说,问题是我正在使用 BouncyCaSTLe 并且它已经签名了。我使用 jarsigner 取消签名,然后让 Netbeans 为我签署所有 jar。如果您不取消签名已签名的库,Netbeans 将跳过它们,因此 JWS 会提示。因此,不要仅使用 jarsigner 来验证您的 jar 是否已签名,而是在所有 jar 上使用 jarsigner 来查找谁签署了它们。如果不匹配,您将收到此消息。干杯。

关于java - 通过 JWS 部署的 Applet 在 JNA 中使用 native 库的正确方法(java web start),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4152674/

相关文章:

java - 将小程序与Web应用程序打包以访问本地文件系统的步骤

java - 如何让gem在Jruby小程序中正常工作?

javascript - 使用react-native-print直接打印文档html

java - 如果同一平台上有两个或多个不同的 jre 实现,会发生什么情况?

ios - 如何在 iOS 上将 "extension"添加到 native 邮件客户端?

c++ - .NET 平台调用中使用的命名约定

java - 正则表达式匹配和替换单词

java - 正则表达式提取字符串,为什么我的模式不起作用?

java - Tomcat 8.5.28 : Bad Set-Cookie header: Secure; HttpOnly No '=' found for token starting at position 75

java - 解码不属于命名空间的 xml 元素