我正在开发使用网络摄像头的Javafx应用程序。为了能够访问相机,我被迫使用OpenCV库和JavACV,该库使用本机OpenCV共享libs。现在,我希望本机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中执行干净并构建时,我将获得一个带有一组罐子的文件夹,这是我的项目依赖性罐子,一个JNLP,HTML,HTML,可执行的JAR以及两个嵌入DLL库的罐子。一个罐子是本地libs-win-x64.jar,第二个是本地libs-win-x86.jar。本机库处于最高级别 - 因此,在每个罐子中,我们都有一组DLL和META-INF文件夹,其中包含:清单交换:1.0,创建:Javafx Packager,Main-Class,Main-Class:null
JNLP文件还包含以下条目:
<resources os="windows" arch="x86"> <nativelib href="native-libs-win-x86.jar"/></resources>
和
现在,当我启动JNLP时,没有加载本机库,升级了undefiedlinkerror。但是,当我将带有DLL的罐子打开到可执行罐,依赖项和JNLP的文件夹中时,一切都像魅力一样工作。所以我的问题是..我想念什么?我已经完成了Javafx文档页面上的蚂蚁任务指南中显示的所有操作。
要具体,并遵循stackoverflow的规则,我提供了有关如何设法解决我的问题的详细信息:
Java可以轻松地加载JNLP描述符中指定的本机库,但我们必须:
1)提供正确的 ARCH 属性值 Resources element-元素 - 请注意,该值是从系统变量OS.ark中获取的x86在32位。就我而言,我必须提供AMD64值。
2)您的jar文件由href属性指向的文件必须包含所有本机库,并且所有库都必须位于jar文件的最高级别。
3)OS属性也从上案例开始 - 对我而言,如果我提供的是=" Windows",则必须是OS =" Windows"