2012-12-18 17 views
1

我試圖從與Windows SDK V7.1在Windows 7機器上的源代碼編譯在OpenJDK 6編制的OpenJDK 6。從Windows 7源使用Windows SDK V7.1

一些調整後,我達到一個地步,我真的不知道什麼是正確的事情。

這裏是文件 - 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的#define語句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。

我真的不知道這是什麼意思,但我不會比教皇更寬容。

回答

0

解決方案很簡單,雖然煩人 - 獲取Visual Studio 2003並使用它來編譯OpenJDK。最困難的部分是獲得VS2003本身,其餘都很容易。