1

Java アプレットと rxtx ライブラリを介してシリアル通信を行っています。アプレットは正常に動作していますが、複数回ロードすると問題が発生します

UnsatisfiedLinkError: rxtxSerial.dll は既に別のクラスローダーにロードされています

Java JVM からライブラリ (DLL) をアンロードする方法に従って、dll をアンロードしようとしていますが、これがこの問題の解決に役立つと思われます。

私が理解したことから、rxtx クラスのカスタム クラス ローダーを使用して、ロードされた dll を含むすべてをある時点でガベージ コレクターにクリーンアップさせることができました。

したがって、次のコードが役立つはずです(シリアルポートとの通信を開始する機能にロードしようとしています)。

cl = new CustomClassLoader();
ca = cl.findClass("gnu.io.CommPortIdentifier");
a = ca.newInstance();
p = ca.getMethod("getPortIdentifier");
portId = (CommPortIdentifier) p.invoke(a, comportUsed);

残念ながら投げますClassNotFoundException

カスタム クラス ローダーに何か問題があると思いますが、何が問題なのかわかりません。

それまたは克服する方法を見つけるのを手伝ってくださいUnsatisfiedLinkError

4

1 に答える 1

0

少し前に、実行時にバグのある DLL をアンロードする必要がありました。残念ながら、これに対する信頼できる解決策はありませんでした。カスタム クラス ローダーを使用している場合でも、Windows Vista などの一部の OS では、DLL のアンロード時に VM が強制終了されます。最後に、DLL を独自のドライバーに置き換える必要がありました。以前のディスカッションを確認できます

https://forums.oracle.com/forums/thread.jspa?threadID=1546756&tstart=1185

おそらく、何度も DLL をロードしないように設計を修正する必要があります。小さな専用 Java サーバー/アプリで十分です。

于 2013-01-07T13:39:54.830 に答える