Javaでシリアル通信するためにRXTXライブラリを使ってCOMポートを開いた


あらまし

先日こんなことがあった

解決したので報告

まず本プロジェクトの環境周りを
プログラムはほぼ触らずに新しいパソコンへ移植というお仕事

  • Windows 7 32bit -> Windows Server 2016 64bit
  • Java6 -> Java8
  • シリアル通信で外部機械との通信あり、シリアル通信にはRXTX-2.1-7というライブラリを使っている

次に起きた問題

// RS232Cポートをオープンする。この処理を実行すると
CommPortIdentifier RSport = CommPortIdentifier.getPortIdentifier("COM1");
// このエラーになる。( rxtxParallel.dll と rxtxSerial.dll を見つけられませんだって )
> java.lang.NoClassDefFoundError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver 
// Javaが64bitだとこのエラーになる。( 呼び出した.dllが32bit版だから動かせないよだって)
> java.lang.UnsatisfiedLinkError: C:\Windows\System32\rxtxSerial.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform thrown while loading gnu.io.RXTXCommDriver

やったこと

  • Javaの再インストール(64bit版をアンインストールして32bit版をインストールした)

Javaだから環境依存しないでしょ?と何も考えずに64bit版のJavaを入れたのも失敗
上にも書いたけどDLLが32bit版の場合は32bit版のJavaからでないと呼び出せない

ちなみに64bit版ライブラリもあるようだ。こちらだったら64bit版Javaでいいかもしれない。(が今回は32bitで押し通す)

  • C:\Windows\SysWOW64rxtxParallel.dllrxtxSerial.dllを配置

以前は32bitOSだからsytem32でよかったけど64bitOSで32bitのライブラリを使うならここに入れる。
なぜならWindowsがリダイレクトするので。

  • RXTXcomm.jarのパスをきっちりクラスパスに設定する

試しに書いたサンプルコードを以下に記す

メモ帳で即席で書いたため汚いのはご愛敬で

run.bat
@echo off
@cd %~dp0

set JAVA_CLASSPATH=%任意のフォルダ%\RXTXcomm.jar

rem =========
rem コンパイル
rem =========
javac -cp "%JAVA_CLASSPATH%" Test.java

@if %errorlevel% equ 0 (cls) else (pause)

rem =========
rem java実行
rem =========
java -cp "%JAVA_CLASSPATH%" Test

pause
Test.java
import gnu.io.CommPortIdentifier;

class Test{

  public static void main(String[] arg){
    showJavaLibrary();
    try{
      // RS232Cポートをオープンする。
      CommPortIdentifier RSport = CommPortIdentifier.getPortIdentifier("COM3");
    }catch(Exception e){
      System.out.println(e.toString());
    }
  }

  public static void showJavaLibrary(){
    System.out.println("パス出力ここから=================");
    for (String str : System.getProperty("java.library.path").split(";")){
      System.out.println(str);
    }
    System.out.println("パス出力ここまで=================");
  }
}

さて実環境を直してきますか