1

我正在尝试使用 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 #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.cAbstractPollArrayWrapper.java)。它使用重命名方法,这意味着即使 Windows SDK v7.1 使用不同的值声明 POLLIN 和 POLLOUT,jdk7 仍坚持 jdk6 的实现。

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

4

1 回答 1

0

解决方案很简单,虽然很烦人 - 获取 Visual Studio 2003 并使用它来编译 OpenJDK。最难的部分是自己拿到VS2003,剩下的就很容易了。

于 2013-02-18T17:40:33.200 回答