我正在开发一个使用网络摄像头的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任务指南中显示的所有内容。
答案 0 :(得分:3)
具体而言,遵循stackoverflow规则,我详细说明了我如何设法解决问题:
Java可以轻松加载jnlp描述符中指定的本机库,但我们必须:
1)在资源元素中提供正确的 arch 属性值 - 请注意,此值取自系统变量os.arch且在64位体系结构上并非总是x64或x86在32位上。在我的情况下,我必须提供amd64值。
2)href属性指向的jar文件必须包含所有本机库,并且所有这些库都必须位于jar文件的顶级。
3)os属性也以大写字母开头 - 对我来说,如果我提供is =“windows”它不起作用它必须是os =“Windows”