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

时间:2012-12-18 00:10:01

标签: windows openjdk winsock2

我正在尝试使用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 #defines POLLINPOLLOUT,而WindowsSelectorImpl.c将它们声明为consts。更糟糕的是,两者都有不同的价值观:

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常量具有完全相同的名称,但值不同......

有任何建议吗?

EDIT1

第二个想法,也许我最好有条件地使用WinSock2中的值?我的意思是值的变化可能意味着API的变化。

WinSock2.h定义了pollfd,如下所示:

typedef struct pollfd {
    SOCKET  fd;
    SHORT   events;
    SHORT   revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;

vs WindowsSelectorImpl.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.cAbstractPollArrayWrapper.java)。它使用重命名方法,这意味着即使Windows SDK v7.1使用不同的值声明POLLIN和POLLOUT,jdk7仍然坚持执行jdk6。

我真的不知道这是什么意思,但我不会比教皇更加宽容。

1 个答案:

答案 0 :(得分:0)

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