2

JWS (Java Web Start) を介してデプロイされたアプレットを使用しています。このアプレットには、いくつかのネイティブ機能が含まれています: 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 が適切なクラスを見つけられなかったことを意味するのだろうかと思います。

さらに奇妙なのは、アプレットでネイティブ メソッドを定義した場合、たとえば、アプレットのボタンをクリックすると 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に変換し、それをjnlpにnativelib hrefとして含める必要がありますが、機能しません。また、アプレット内のネイティブ関数へのすべての呼び出しを doPrivileged でラップしようとしても機能しません。

どんな助けでもいただければ幸いです

4

1 に答える 1

3

Try again メッセージを取り除くことができました。

問題は、JWS のアーカイブおよび/またはコードベース jar が同じ機関によって署名されていない場合に問題が発生することです。私の問題は、BouncyCastle を使用していて、既に署名されていることでした。jarsigner を使用して署名を解除し、Netbeans にすべての jar に署名させました。署名済みライブラリの署名を解除しないと、Netbeans はそれらをスキップし、その結果、JWS は文句を言います。したがって、jarsigner を jar が署名されているかどうかを確認するためだけに使用しないでください。すべての jar で jarsigner を使用して、署名者を見つけてください。不一致がある場合、このメッセージが表示されます。乾杯。

于 2011-02-24T08:22:15.933 に答える