通过jnlp WebStart启动JavaFx应用程序 - 不加载jnlp描述符中定义的系统本机库

时间:2012-10-22 09:10:56

标签: java javafx jnlp java-web-start

我正在开发一个使用网络摄像头的JavaFX应用程序。为了能够访问摄像头,我被迫使用opencv库和使用本机opencv共享库的javacv。现在我希望以某种方式在用户机器上安装本机dll,以便java可以使用它们。我阅读了javafx的整个ant任务参考,并找到了一个示例,它解释了如何将原生系统库添加到应用程序包以使其工作。我正在使用netbeans来构建javafx应用程序包。以下是我如何自定义netbeans用于构建应用程序的build.xml文件。

 <import file="nbproject/build-impl.xml"/>


<target name="-post-jfx-jar" depends="-check-jfx-sdk-version">
   <echo message="Embedding native libraries..."/>
      <fx:jar destfile="${basedir}/build/native-libs-win-x86.jar">
        <fx:fileset dir="${basedir}/natives/windows/x86" includes="*"/>          
      </fx:jar>              
      <fx:jar destfile="${basedir}/build/native-libs-win-x64.jar">
         <fx:fileset dir="${basedir}/natives/windows/x64" includes="*"/>    
      </fx:jar>
   <echo message="Natives embedded..."/>           
</target>
<target name="-post-jfx-deploy" depends="-post-jfx-jar">
   <echo message="deploying ..."/>
     <fx:deploy width="600" height="400"
                outdir="${basedir}/${bundle.outdir}"
                outfile="AppName">
            <fx:info title="AppName"/>
            <fx:application name="${bundle.name}"
                            mainClass="pl.company.project.EntryClass"/>
            <fx:permissions elevated="true"/>
            <fx:resources>

                <fx:fileset dir="dist" includes="*.jar"/>
                <fx:fileset dir="dist/lib" includes="*.jar"/>


                <fx:fileset dir="build" type="native"
                            os="windows" arch="x86"
                            includes="native-libs-win-x86.jar"/>

                <fx:fileset dir="build" type="native"
                            os="windows" arch="x64"
                            includes="native-libs-win-x64.jar"/>

            </fx:resources>
     </fx:deploy>       
</target>   

现在,当我执行clean并构建netbeans时,我得到一个包含jars的文件夹,这是我的项目依赖项jars,一个jnlp,html,可执行jar,以及嵌入了dll库的两个jar。一个jar是native-libs-win-x64.jar,第二个是native-libs-win-x86.jar。本机库位于顶层 - 所以在每个jar中我们都有一组dll和META-INF文件夹,其中包含:Manifest-Version:1.0,Created-By:JavaFX Packager,Main-Class:null

Jnlp文件还包含以下条目:

 <resources os="windows" arch="x86">    <nativelib href="native-libs-win-x86.jar"/></resources>

和          

现在,当我启动jnlp时,未加载本机库,引发了UnsatisfiedLinkError。但是当我用dll将jar解包到可执行jar,依赖项和jnlp的文件夹中时,一切都像魅力一样。所以我的问题是......我错过了什么?我已经完成了JavaFX文档页面上的ant任务指南中显示的所有内容。

1 个答案:

答案 0 :(得分:3)

具体而言,遵循stackoverflow规则,我详细说明了我如何设法解决问题:

Java可以轻松加载jnlp描述符中指定的本机库,但我们必须:

1)在资源元素中提供正确的 arch 属性值 - 请注意,此值取自系统变量os.arch且在64位体系结构上并非总是x64或x86在32位上。在我的情况下,我必须提供amd64值。

2)href属性指向的jar文件必须包含所有本机库,并且所有这些库都必须位于jar文件的顶级。

3)os属性也以大写字母开头 - 对我来说,如果我提供is =“windows”它不起作用它必须是os =“Windows”