代码之家  ›  专栏  ›  技术社区  ›  Nikola Yovchev

在JNA中使用本地库和JWS部署Applet的正确方法(java web start)

  •  2
  • Nikola Yovchev  · 技术社区  · 14 年前

    我使用的是通过JWS(Java Web Start)部署的applet。这个applet包含一些本机功能:JNA。用户32、内核32和Gdi32。当我通过JWS启动applet时,会得到以下结果:

    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找不到合适的类。

    更奇怪的是,如果我在applet中定义了一个本机方法,例如,当单击applet上的按钮时,它会给我一个Windows消息框,如果我单击applet上的按钮,它就会工作,但是如果我试图通过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-ref包含在我的jnlp中,但它不起作用。此外,尝试用doPrivileged包装对applet中本机函数的每个调用也不起作用。

    任何帮助都将不胜感激

    1 回复  |  直到 14 年前
        1
  •  3
  •   Nikola Yovchev    14 年前

    我确实设法摆脱了“再试一次”的消息。

    问题是,如果JWS的存档和/或代码库jar不是由同一个权威签署的,那么JWS会有一些问题。对我来说,问题是我使用的是BouncyCastle,它已经被签名了。我用jarsigner签名,然后让Netbeans为我签名所有jar。如果您没有对已签名的lib进行签名,Netbeans将跳过它们,结果JWS会抱怨。所以,不要只使用jarsigner来验证您的jar是否已签名,在所有jar上使用jarsigner来查找签名者。如果不匹配,您将收到此消息。干杯。