0

ウェブカメラを使用する JavaFX アプリケーションを開発しています。カメラにアクセスできるようにするために、opencv ライブラリと、ネイティブの opencv 共有ライブラリを使用する javacv を使用する必要がありました。Javaがそれらを使用できるように、ネイティブdllをユーザーマシンに何らかの方法でインストールする必要があります。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 と build を実行すると、プロジェクトの依存関係の jar、1 つの jnlp、html、実行可能 jar、および dll ライブラリが埋め込まれた 2 つの jar である一連の jar を含むフォルダーが取得されます。1 つの jar は native-libs-win-x64.jar で、2 つ目は 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 が発生します。しかし、実行可能なjar、依存関係、およびjnlpがあるフォルダーにdllを含むjarを解凍すると、すべてが魅力的に機能します。だから私の質問は..何が欠けているのですか? JavaFX ドキュメント ページの ant タスク ガイドに示されているように、すべてを実行しました。

4

1 に答える 1

3

具体的には、stackoverflow のルールに従って、問題をどのように解決したかについて詳しく説明します。

Java は、jnlp 記述子で指定されたネイティブ ライブラリを簡単にロードできますが、次のことを行う必要があります。

1) resources要素に正しいarch属性値を指定します。この値はシステム変数 os.arch から取得され、必ずしも 64 ビット アーキテクチャでは x64、32 ビットでは x86 であるとは限りません。私の場合、amd64 値を提供する必要があります。

2)href属性が指すjarファイルにはすべてのネイティブライブラリが含まれている必要があり、それらはすべてjarファイルの最上位にある必要があります。

3) また、os 属性は大文字で始まります。私にとっては、is="windows" を指定しても機能しません。os="Windows" でなければなりません。

于 2012-10-23T12:25:31.660 に答える