1

WindowsSDKv7.1を搭載したWindows7マシンのソースからOpenJDK6をコンパイルしようとしています。

いくつかの調整を行った後、私は本当に何をすべきかわからないところに到達しました。

これがファイルです-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#definesPOLLINPOLLOUT、が、WindowsSelectorImpl.cがそれらをconstsとして宣言していることに注目してください。さらに悪いことに、両方とも異なる値を与えます。

OpenJDK:

POLLIN = 1
POLLOUT = 4

WinSock2(Windows SDK v7.1):

POLLIN = 0x300
POLLOUT = 0x10

明らかに、OpenJDKコードはWindows7でコンパイルされることは想定されていません。

ただし、Windows7でコンパイルしたいと思います。

オプションの1つは、古いWindowsSDKをインストールすることです。もう1つは、ファイルWindowsSelectorImpl.cを変更することです。問題は、どのように行うかです。私の意図は定数の名前を変更することですが、WinSock2 #defining定数をまったく同じ名前で、値が異なることについて疑問に思わずにはいられません...

何かアドバイスはありますか?

編集1

考え直してみると、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の実装に固執します。

私はそれが何を意味するのか本当にわかりませんが、私はここで教皇よりもカトリックになるつもりはありません。

4

1 に答える 1

0

解決策は単純ですが、面倒です。VisualStudio 2003を入手し、それを使用してOpenJDKをコンパイルします。最も難しい部分はVS2003自体を入手することであり、残りはすべて簡単です。

于 2013-02-18T17:40:33.200 に答える