当前位置: 首页 > 知识库问答 >
问题:

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

万博涛
2023-03-14

我正在开发一个使用网络摄像头的JavaFX应用程序。为了能够访问camera,我被迫使用opencv库和javacv(使用本机opencv共享库)。现在,我希望本机DLL以某种方式安装在用户机器上,以便java可以使用它们。我阅读了整个ant tasks reference for javafx并找到了一个示例,它解释了如何将本机系统添加到应用程序包中以使其工作。我正在使用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和build时,我会得到一个文件夹,里面有一组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 task guide所示完成了所有工作。

共有1个答案

苏鸿羽
2023-03-14

具体地说,按照stackoverflow的规则,我将详细介绍如何解决问题:

Java可以很容易地加载jnlp描述符中指定的本机库,但我们必须:

1)在resources元素中提供正确的arch属性值-注意,该值取自系统变量os.arch,它不总是64位架构上的x64或32位架构上的x86。在我的情况下,我必须提供amd64值。

 类似资料:
  • 当我试图通过Java Web Start部署JavaFX桌面应用程序时,特别是当它决定下载JAR时,我得到了不一致的行为。我的代码签名了。 所需要的: > 桌面应用程序,100%脱机工作,但在有internet连接时检查更新。 如果发现更新,询问用户是否要下载。如果是,更新并运行。如果没有,则运行缓存版本。 桌面图标需要制作。 目前正在计划发生的事情: 在首次运行时,web start将下载并完美

  • 问题内容: 我创建了一个Java桌面应用程序(使用Swing),现在尝试通过使用JNLP从网络启动它使其工作。当我从终端启动应用程序时,它运行良好,但是一旦从JNLP启动它,它就不会关闭。我必须每次都手动终止该进程。 我读到如果将其用作默认关闭操作可能会出现问题,但事实并非如此。它使用(隐式)。另外,释放所有对象后,我将显式调用: 我猜想在关闭应用程序时可能会引发异常,但是我找不到从JNLP开始获

  • 我使用JNI编写了一个小的C程序,我想从NFC系统应用程序内部调用它,特别是NFCDispatcher.java类。到目前为止,我已经做了以下工作: 在/aosp/packages/apps/nfc/中创建了一个/JNI目录,我在这里编写了以下JNI代码。NFC/JNI/dir有两个文件,即mycustomlib.c和Android.mk,如下所示 mycustomlib.c at/aosp/pa

  • 我已经创建了一个JavaFX应用程序,并使用蚂蚁创建了它的本机包。当我试图启动应用程序使用Jar从捆绑创建双击,它成功启动我的应用程序。但是当我试图双击MyApplication.exe(比如说)时,它会抛出JavaFX启动器错误“运行应用程序时异常”。 我比较了两个jre,有很多丢失的jar,exe,dll和一些属性文件我发现。 我有这些环境设置- JAVA_HOME和JREFX_HOME在我的

  • 这是我的第一个问题。我一路寻找,尝试了很多,但没有得到我想做的。问题是:我有一个应用程序使用SoundPool播放声音,仅此而已。但是要加载的东西很多(>50),一个一个加载需要时间。看一看; @Override公共视图onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){View V

  • 解决办法是: 使用路径/somefxml.fxml。 使用FXMLLoader.Load(getClass().GetClassLoader().GetResource(“SomeFXml.fxml”)); 使用FXMLLoader.Load(getClass().GetClassLoader().GetResource(“packageName/somefxml.fxml”)); 检查文件是否存