我正在尝试使用 Windows SDK v7.1 从 Windows 7 机器上的源代码编译 OpenJDK 6。
经过一些调整,我达到了一个我真的不知道什么是正确的做法的地步。
第 47 和 49 行:
static int POLLIN = 1; // line 47
static int POLLCONN = 2;
static int POLLOUT = 4; // line 49
问题是包含的文件 winsock2.h 有以下代码:
#if(_WIN32_WINNT >= 0x0600)
/* Event flag definitions for WSAPoll(). */
#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400
#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020
#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004
typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
#endif // (_WIN32_WINNT >= 0x0600)
注意 winsock2 #definesPOLLIN
和是如何定义的POLLOUT
,而 WindowsSelectorImpl.c 将它们声明为 const。更糟糕的是,两者都给出不同的值:
OpenJDK:
POLLIN = 1
POLLOUT = 4
WinSock2 (Windows SDK v7.1):
POLLIN = 0x300
POLLOUT = 0x10
显然,OpenJDK 代码不应该在 Windows 7 上编译。
但是,我确实想在 Windows 7 上编译它。
一种选择是安装较旧的 Windows SDK。另外就是改文件WindowsSelectorImpl.c,问题是怎么做?我的意图是重命名常量,但我不禁想知道 WinSock2 #defining 常量名称完全相同,但值不同......
有什么建议吗?
编辑1
再想一想,也许我最好有条件地使用 WinSock2 中的值?我的意思是值的变化可能意味着 API 的变化。
WinSock2.h 像这样定义 pollfd:
typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
与 WindowsSelectorImpl.c:
typedef struct {
jint fd;
jshort events;
} pollfd;
前者向后兼容后者(或多或少,对齐除外)。
所以,WinSock2 常量有可能是适用于 Windows 7 的常量,但那该怎么办POLLCONN
呢?代码将如何在 Windows 2003 或 XP 上运行?
编辑2
情况更糟,因为 C 实现在 java 中有一个匹配的对应物 - http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/tip/src/windows/classes/sun/nio/ch/ WindowsSelectorImpl.java,它使用与 C 代码相同的常量。
我不明白这一点。Windows 7 上的 winsock2 是否会破坏为 Windows 2003 SP1 上的 winsock2 编写的任何代码?
编辑3
检查 jdk7u 源(WindowsSelectorImpl.c和AbstractPollArrayWrapper.java)。它使用重命名方法,这意味着即使 Windows SDK v7.1 使用不同的值声明 POLLIN 和 POLLOUT,jdk7 仍坚持 jdk6 的实现。
我真的不知道这是什么意思,但我在这里不会比教皇更天主教。