0

コンピューターに接続された CAN 周辺機器とインターフェイスし、コンピューターとマイクロコントローラー間の通信を可能にする GUI を作成しようとしています。ほとんどの作業は Java で行われますが、CAN コードは C++ で記述され、JNI を使用して Java から呼び出されます。C++ には Visual Studio 2013、Java には Eclipse を使用しています。

プログラムは開発用コンピューターでは問題なく動作しますが、私は DLL の作成に不慣れで、プログラムを別のコンピューターで実行することはできません。私は Dependency Walker を使用して、どの DLL をアプリケーションにバンドルする必要があるかを把握しました。この時点で、欠落していると言われているすべての DLL を含めました (まだ欠落していると書かれているものがいくつかありますが、これらは開発用コンピューターにもありません。これは単に Dependency Walker の問題だと思います)。

アプリケーション フォルダーには、GUI の実行可能な jar ファイル、作成した DLL、および依存する DLL が含まれています。「java -jar {application.jar}」を使用してコマンドラインからアプリケーションを実行しようとしました。次のエラーが表示されます。

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: C:\Users\David\Dropbox\ATPBoardInterface\CANMessager7.dll: A dynamic link library (DLL) initialization routine failed
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1939)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1864)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1854)
    at java.lang.Runtime.loadLibrary0(Runtime.java:845)
    at java.lang.System.loadLibrary(System.java:1084)
    at model.CANController.<clinit>(CANController.java:34)
    at main.Main$1.run(Main.java:70)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

この問題を解決する方法についての提案を探しています。エンド ユーザーが簡単にインストールして実行できる、他の Windows コンピューターと共有できるもの。

編集:違いがある場合、プログラムはナショナルインスツルメンツのCANソフトウェアの使用に依存しています。Dependency Walker がリストしたこれに関連するアプリケーション フォルダーに多数の DLL を含めましたが、それで十分かどうかはわかりません。ターゲット コンピュータが動作するためには、ナショナル インスツルメンツの特定のソフトウェアが既にインストールされている必要があります。それが見つからない場合、それが DLL の初期化エラーの原因になっている可能性があります。どちらにしても、私はこの種の分野に精通していません。

編集 2: これは、アプリケーション フォルダー内にバンドルしたものです。

20/08/2013  10:56    <DIR>          .
20/08/2013  10:56    <DIR>          ..
20/08/2013  08:26           427,170 ATPBoardInterface.jar
20/08/2013  09:28           182,928 CANMessager.lib
20/08/2013  08:52           201,728 CANMessager7.dll
15/08/2013  16:28            30,720 CANMessagerXP.dll
16/06/2013  21:11           966,224 msvcr120.dll
11/07/2006  18:35           348,160 msvcr71.dll
13/10/2012  11:00           655,872 msvcr90.dll
01/06/2011  17:59            45,192 Nican.dll
06/04/2010  17:44            72,224 NicanCfq.dll
06/04/2010  17:44           125,472 nicanDBA.dll
01/06/2011  17:59           197,784 NIcanFrm.dll
01/06/2011  17:59            18,080 NIcanpu.dll
01/06/2011  17:59            61,568 NicanTsk.dll
26/01/2012  15:54            19,632 nipal32.dll
26/01/2012  16:11           309,920 nipalu.dll
26/01/2012  15:53            12,968 nipalut.dll
19/08/2013  16:18               772 README.txt
20/08/2013  08:34    <DIR>          res
20/08/2013  10:56                 0 temp.txt
20/08/2013  09:43         6,494,784 vcredist_x86.exe
              19 File(s)     10,171,198 bytes
               3 Dir(s)  416,406,867,968 bytes free

これらのどれが必要なのかわかりません。

4

1 に答える 1

0

1 つの問題は、32/64 ビットの問題である可能性があります。

CAN インターフェイス DLL が 32 ビット DLL で、64 ビット Java を実行している場合、これは機能しません。32 ビット Java で 64 ビット DLL を実行しても機能しません。

唯一の解決策は、DLL を 32 ビット バージョンと 64 ビット バージョンとしてコンパイルし、両方の DLL バージョンを提供することです。

32/64 ビットが問題でない場合は、SysInternals ProcessExplorer ツールを使用して、すべてのファイル アクセス試行を確認できます。この場合、存在しない DLL ファイルに Java がアクセスしようとしているかどうかがわかります。

32/64 ビットの問題の解決策は、DLL ファイルの代わりにコマンド ライン EXE ファイルを使用することです。データは、標準出力と標準入力 (C++ 側) を使用して転送され、Java 側では java.lang.Process クラスの InputStream と OutputStream を使用して転送されます。これは常に 32 ビット EXE ファイルで機能します。

于 2013-08-21T21:02:47.790 に答える