使用Windows SDK v7.1从Windows 7上的源代码编译OpenJDK 6



我正试图在带有Windows SDK v7.1的Windows 7机器上从源代码编译OpenJDK 6。

经过一些调整后,我真的不知道该做什么才是正确的。

这是文件-http://hg.openjdk.java.net/jdk6/jdk6/jdk/file/tip/src/windows/native/sun/nio/ch/WindowsSelectorImpl.c

第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#是如何定义POLLINPOLLOUT的,而WindowsSelectorImpl.c则将它们声明为常量。更糟糕的是,两者都给出了不同的值:

OpenJDK:

POLLIN = 1
POLLOUT = 4

WinSock2(Windows SDK v7.1):

POLLIN = 0x300
POLLOUT = 0x10

显然,OpenJDK代码不应该在Windows7上编译。

然而,我确实想在Windows7上编译它。

其中一个选项是安装较旧的Windows SDK。另一个是更改文件WindowsSelectorImpl.c,问题是如何更改?我的意图是重命名常量,但我不禁想知道WinSock2#定义的常量名称完全相同,但值不同。。。

有什么建议吗?

EDIT1

转念一想,也许我最好有条件地使用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常量有可能是适用于Windows7的常量,但如何处理POLLCONN呢?这些代码将如何在Windows2003或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的实现。

我真的不知道这是什么意思,但我在这里不会比教皇更信奉天主教。

解决方案很简单,但很烦人-获取Visual Studio 2003并使用它编译OpenJDK。最困难的部分是获得VS2003本身,其余的都很容易。

最新更新