次のような簡単なcプログラムを書きたいと思います。パラレルポートへの接続を開き、ピン2をハイにし、ピン2をローにして、接続を閉じます。これにはJNIを使用しているので、Javaソースファイルは次のようになります。
package meas;
public class Meas {
public static native boolean open();
public static native boolean on();
public static native boolean off();
public static native boolean close();
}
Javaファイルはパラレルポートを制御する必要があることに注意してください。つまり、パラレルポートをいつ高くするか低くするかを決定します。次に、javahを使用してacヘッダーファイルを抽出しました。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class meas_Meas */
#ifndef _Included_meas_Meas
#define _Included_meas_Meas
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: meas_Meas
* Method: open
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_open
(JNIEnv *, jclass);
/*
* Class: meas_Meas
* Method: on
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_on
(JNIEnv *, jclass);
/*
* Class: meas_Meas
* Method: off
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_off
(JNIEnv *, jclass);
/*
* Class: meas_Meas
* Method: close
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_close
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
次に、これをLinux用に実装しました。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/types.h>
#include <fcntl.h>
#include <meas_Meas.h>
#define BASEPORT 0x378 /* lp1 */
int tem;
/*
* Class: meas_Meas
* Method: open
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_open(JNIEnv *env, jclass clz) {
//set permissions to access port
if (ioperm(BASEPORT, 3, 1)) {
perror("ioperm");
exit(1);
}
tem = fcntl(0, F_GETFL, 0);
fcntl(0, F_SETFL, (tem | O_ASYNC));
}
/*
* Class: meas_Meas
* Method: on
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_on(JNIEnv *env, jclass clz) {
outb(255, BASEPORT);
}
/*
* Class: meas_Meas
* Method: off
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_off(JNIEnv *env, jclass clz) {
outb(0, BASEPORT);
}
/*
* Class: meas_Meas
* Method: close
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_meas_Meas_close(JNIEnv *env, jclass clz) {
fcntl(0, F_SETFL, tem);
outb(0, BASEPORT);
//take away permissions to access port
if (ioperm(BASEPORT, 3, 0)) {
perror("ioperm");
exit(1);
}
}
私はCエクスポートではないので、上記のコードは奇妙に見えるかもしれません。しかし、それは実際には問題ではありません。重要なのは、これをWindowsにも実装したいということです。目標は、Linux用のlibMeas.soをすでに持っているのと同じように、dllを取得することです。私はすでにMinGWを動作させていますが、問題はWindowsではsys/io.hを使用できないことです。これを行う方法に関するドキュメントをGoogleで検索すると、パラレルポートにデータを書き込む方法に関するチュートリアルが表示されます。これは必要ありません。ピン2をハイまたはローにしたいだけです。私の推測では、これはかなり単純なはずです。(同じヘッダーファイルを使用して)Windowsでこれを行う方法について誰かが私を正しい方向に向けることができますか?