我試圖從與Windows SDK V7.1在Windows 7機器上的源代碼編譯在OpenJDK 6編制的OpenJDK 6。從Windows 7源使用Windows SDK V7.1
一些調整後,我達到一個地步,我真的不知道什麼是正確的事情。
的線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的#define語句POLLIN
和POLLOUT
,而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.c和AbstractPollArrayWrapper.java)。它使用重命名方法,這意味着即使Windows SDK v7.1使用不同的值聲明POLLIN和POLLOUT,但jdk7仍堅持使用jdk6。
我真的不知道這是什麼意思,但我不會比教皇更寬容。