有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过JWS(JavaWebStart)部署的小程序在JNA中使用本机库的正确方法

我正在使用通过JWS(JavaWebStart)部署的小程序。此小程序包含一些本机功能: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自动签名,但即使我手动签名,它也不起作用)。由于我对applet和JWS技术还不太熟悉,我想知道是否可以再试一次。。。意味着JNLP找不到合适的类

更奇怪的是,如果我在小程序中定义了一个本机方法,例如,一个方法在单击小程序上的按钮时会给我一个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的user32_x86目录。将jar单独放入一个jar中,并将其作为nativelib href包含在我的jnlp中,但它不起作用。此外,尝试用doPrivileged包装小程序中对本机函数的每次调用也不起作用

任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

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

    问题是,如果JWS的归档文件和/或代码库JAR不是由同一权威机构签署的,那么JWS就会出现一些问题。对我来说,问题是我使用的是BouncyCastle,而且它已经签名了。我使用jarsigner取消了它的签名,然后让Netbeans为我签名所有jar。如果不取消签名已签名的lib,Netbeans将跳过它们,因此JWS会抱怨。因此,不要只使用jarsigner来验证您的JAR是否已签名,而要在所有JAR上使用jarsigner来查找签名者。如果存在不匹配,您将收到此消息。干杯