使用Windows SDK v7从Windows 7上的源代码编译OpenJDK 6。1.
我正在尝试从Windows 7机器上的Windows SDK v7源代码编译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#如何定义POLLIN
和POLLOUT
,而WindowsSelectorImpl。c将它们声明为常量。更糟糕的是,两者给出了不同的值:
OpenJDK:
POLLIN = 1
POLLOUT = 4
WinSock2(Windows SDK v7.1版):
POLLIN = 0x300
POLLOUT = 0x10
显然,OpenJDK代码不应该在Windows 7上编译
不过,我确实想在Windows 7上编译它
其中一个选项是安装较旧的Windows SDK。另一种方法是更改文件WindowsSelectorImpl。c、 问题是怎么做?我的意图是重命名常量,但我忍不住想知道WinSock2#用完全相同的名称定义常量,但值不同
有什么建议吗
EDIT1
再想想,也许我最好有条件地使用WinSock2中的值?我的意思是,值的变化可能意味着API的变化
WinSock2。h对pollfd的定义如下:
typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
vs Windows SelectorImpl。c:
typedef struct {
jint fd;
jshort events;
} pollfd;
前者向后兼容后者(或多或少,撇开对齐不谈)
因此,WinSock2常量很可能是Windows 7的正确常量,但接下来如何处理POLLCONN
?该代码将如何在Windows 2003或XP上运行
EDIT2
情况甚至更糟,因为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编写的任何代码
EDIT3
检查了jdk7u源代码(WindowsSelectorImpl.c和AbstractPollArrayWrapper.java)。它使用了重命名方法,这意味着即使Windows SDK v7。1使用不同的值声明POLLIN和POLLOUT,jdk7坚持jdk6的实现
我真的不知道这意味着什么,但我不会比教皇更信奉天主教
# 1 楼答案
解决方案很简单,但很烦人——获取Visual Studio 2003并使用它编译OpenJDK。最困难的部分是获得VS2003本身,其余的都很容易