gpt4 book ai didi

c - 将一个简单的 c 程序从 linux 移植到 windows

转载 作者:可可西里 更新时间:2023-11-01 12:00:18 26 4
gpt4 key购买 nike

我想编写一个简单的 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提取了一个c头文件。

/* 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 实现这个。目标是得到一个dll,就像我已经有一个用于Linux的libMeas.so一样。我已经让 MinGW 正常工作,但问题是在 Windows 上你不能使用 sys/io.h。在谷歌上搜索有关如何执行此操作的文档,会得到有关如何在并行端口上写入数据的教程。我不想要这个,我只想让引脚 2 变高或变低。我的猜测是这应该相当简单。谁能指出正确的方向,告诉我如何为 Windows 执行此操作(使用相同的头文件)?

最佳答案

要在 Windows 上编译 C 代码,您应该在所有细节(outb、fcntl)周围添加 #ifdef。

使用 _inp/_outp 内在函数直接访问端口。有关这些信息,请参阅 MSDN。

http://msdn.microsoft.com/en-us/library/y7ae61bc(v=vs.80).aspx

要使用 MinGW (gcc/win32) 获取 .dll 文件,只需使用“-shared”命令行开关即可。

gcc -o libMeas.dll -shared source.c <your_libraries_for_win32>

i586-mingw32msvc-gcc 也适用于 linux(交叉编译)

x64 版本也有问题。

看起来你必须为这类东西使用驱动程序,因为 _inp/_outp 可以在 DDK(Driver DevKit)中访问,而不是“开箱即用”。

看这里http://www.highrez.co.uk/downloads/inpout32/default.htm对于 32/64 位驱动程序。

有一个关于在托管环境中读取并行端口的完整线程(在那种情况下是 .NET,但我猜 JNI 也可以):http://www.vbforums.com/showthread.php?t=643913

关于c - 将一个简单的 c 程序从 linux 移植到 windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10682407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com