Правильный способ использования нативных библиотек в JNA с апплетом, развернутым JWS (запуск Java-сети) - PullRequest
2 голосов
/ 11 ноября 2010

Я использую апплет, развернутый через 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, кажется, они все подписаны (я использую автоматическую подпись 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>

Согласно некоторым сведениям, я должен преобразовать каталог user32_x86 jna.jar в jar-файл и включить его в качестве href nativelib в мой jnlp, но он не работает. Кроме того, попытка обернуть каждый вызов нативных функций в апплете с помощью doPrivileged также не работает.

Любая помощь будет оценена

1 Ответ

3 голосов
/ 24 февраля 2011

Мне удалось избавиться от сообщений «Повторить попытку».

Проблема в том, что у JWS есть некоторые проблемы, если его архивы и / или файлы базы кода не подписаны одним и тем же органом.Со мной проблема была в том, что я использовал BouncyCastle, и он был уже подписан.Я подписал его, используя jarsigner, а затем позволил Netbeans подписать все банки для меня.Если вы не подписываете подписанные библиотеки, Netbeans пропустит их, и в результате JWS будет жаловаться.Поэтому не используйте jarsigner только для проверки, если ваши банки подписаны, используйте jarsigner на всех банках, чтобы узнать, кто их подписал.Если есть несоответствия, вы получите это сообщение.Приветствия.

...