我正在开发一个使用网络摄像头的 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 任务指南中显示的所有操作。