0

我正在开发一个使用网络摄像头的 JavaFX 应用程序。为了能够访问相机,我被迫使用 opencv 库和 javacv,它们使用本机 opencv 共享库。现在我希望本地 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>   

现在,当我在 netbeans 中执行 clean 并构建时,我得到了一个包含一组 jar 的文件夹,这些 jar 是我的项目依赖 jar、一个 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 任务指南中显示的所有操作。

4

1 回答 1

3

具体来说,并遵循stackoverflow的规则,我将详细说明我如何设法解决我的问题:

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

1) 在资源元素中提供正确的arch属性值- 请注意,此值取自系统变量 os.arch,它并不总是在 64 位架构上为 x64 或在 32 位上为 x86。就我而言,我必须提供 amd64 值。

2) You jar file pointed by href attribute has to contain all native libraries, and all of them have to be in the top level of jar file.

3) Also os attribute starts with upper case - for me it doesnt work if I provide is="windows" it must be os="Windows"

于 2012-10-23T12:25:31.660 回答