インタフェースSymbolLookup
- 関数型インタフェース:
- これは関数型インタフェースなので、ラムダ式またはメソッド参照の代入先として使用できます。
シンボル・ルックアップは、特定のライブラリ (またはライブラリ)に対して作成されます。 その後、find(String)
メソッドはシンボルの名前を取得し、そのライブラリ内のシンボルのアドレスを返します。
シンボルのアドレスは、長さゼロの「メモリー・セグメント」としてモデル化されます。 セグメントは次の様々な方法で使用できます:
Linker
に渡してダウンコール・メソッド・ハンドルを作成でき、これを使用してセグメントのアドレスで外部ファンクションをコールできます。- これは、基礎となる外部関数の引数として、既存のdowncall method handleRESTRICTEDに渡すことができます。
- 別のメモリー・セグメント内で「保管済み」にできます。
- グローバル変数(この場合は、最初にセグメントresizingRESTRICTEDが必要です)をバッキングするメモリー・リージョンにアクセスするために使用できます。
シンボル・ルックアップの取得
ファクトリ・メソッドlibraryLookup(String, Arena)
RESTRICTEDおよびlibraryLookup(Path, Arena)
RESTRICTEDは、オペレーティング・システムで認識されるライブラリのシンボル・ルックアップを作成します。 ライブラリは、その名前またはパスで指定されます。 ライブラリがまだロードされていない場合はロードされます。 シンボル・ルックアップ(「ライブラリ・ルックアップ」と呼ばれ、その存続期間は「アリーナ」によって制御されます)。 たとえば、指定されたアリーナが限定されたアリーナである場合、限定されたアリーナがclosedのときに、シンボル・ルックアップに関連付けられたライブラリがアンロードされます。
try (Arena arena = Arena.ofConfined()) {
SymbolLookup libGL = SymbolLookup.libraryLookup("libGL.so", arena); // libGL.so loaded here
MemorySegment glGetString = libGL.findOrThrow("glGetString");
...
} // libGL.so unloaded here
以前にSystem.load(String)
またはSystem.loadLibrary(String)
によってJNI、i.eを介してライブラリがロードされていた場合、ライブラリは特定のクラス・ローダーにも関連付けられていました。 ファクトリ・メソッドloaderLookup()
は、コール元クラス・ローダーに関連付けられたすべてのライブラリのシンボル・ルックアップを作成します:
System.loadLibrary("GL"); // libGL.so loaded here
...
SymbolLookup libGL = SymbolLookup.loaderLookup();
MemorySegment glGetString = libGL.findOrThrow("glGetString");
ローダー・ルックアップでは、System.load(String)
またはSystem.loadLibrary(String)
によって以前にJNI、i.eを介してロードされたライブラリ内の記号のみが公開されることに注意してください。 ローダー・ルックアップでは、ライブラリ・ルックアップの作成中にロードされたライブラリ内のシンボルは公開されません:
libraryLookup("libGL.so", arena).find("glGetString").isPresent(); // true
loaderLookup().find("glGetString").isPresent(); // false
L
のライブラリ・ルックアップでは、L
が以前にJNI (クラス・ローダーとの関連付けはライブラリ・ルックアップにとって重要ではありません)を介してロードされている場合でも、L
のシンボルが公開されることにも注意してください:
System.loadLibrary("GL"); // libGL.so loaded here
libraryLookup("libGL.so", arena).find("glGetString").isPresent(); // true
最後に、各Linker
は、そのLinker
でサポートされているOSとプロセッサの組合せで一般的に使用されるライブラリのシンボル・ルックアップを提供します。 このシンボル・ルックアップは「デフォルト・ルックアップ」と呼ばれ、クライアントが既知のシンボルのアドレスをすばやく検索するのに役立ちます。 たとえば、Linux/x64のLinker
は、デフォルトのルックアップを介してlibc
のシンボルを公開することを選択できます。
Linker nativeLinker = Linker.nativeLinker();
SymbolLookup stdlib = nativeLinker.defaultLookup();
MemorySegment malloc = stdlib.findOrThrow("malloc");
- 導入されたバージョン:
- 22
-
メソッドのサマリー
修飾子と型メソッド説明指定された名前のシンボルのアドレスを返します。default MemorySegment
findOrThrow
(String name) 指定された名前を持つシンボルのアドレスを返すか、例外をスローします。static SymbolLookup
libraryLookup
(String name, Arena arena) Restricted.指定された名前 (まだロードされていない場合)のライブラリをロードし、そのライブラリ内のシンボルのシンボル・ルックアップを作成します。static SymbolLookup
libraryLookup
(Path path, Arena arena) Restricted.指定されたパス (まだロードされていない場合)からライブラリをロードし、そのライブラリ内のシンボルのシンボル・ルックアップを作成します。static SymbolLookup
呼び出し元クラス・ローダーに関連付けられたライブラリ内のシンボルのシンボル・ルックアップを返します。default SymbolLookup
or
(SymbolLookup other) シンボルが見つかった場合は、このルックアップでシンボルを検索した結果を返す合成シンボル・ルックアップを返します。それ以外の場合は、ほかの検索でシンボルを検索した結果を返します。
-
メソッドの詳細
-
find
Optional<MemorySegment> find(String name) 指定された名前のシンボルのアドレスを返します。- パラメータ:
name
- シンボル名- 戻り値:
- アドレスがシンボルのアドレスを示す長さがゼロのメモリー・セグメント(見つかった場合)
- 関連項目:
-
findOrThrow
default MemorySegment findOrThrow(String name) 指定された名前を持つシンボルのアドレスを返すか、例外をスローします。これは次のコードと同等ですが、より効率的です: 宛先:
String name = ... MemorySegment address = lookup.find(name) .orElseThrow(() -> new NoSuchElementException("Symbol not found: " + name));
- パラメータ:
name
- シンボル名- 戻り値:
- アドレスがシンボルのアドレスを示す長さゼロのメモリー・セグメント
- 例外:
NoSuchElementException
- 指定された名前のシンボル・アドレスが見つからない場合- 導入されたバージョン:
- 23
- 関連項目:
-
or
default SymbolLookup or(SymbolLookup other) シンボルが見つかった場合は、このルックアップでシンボルを検索した結果を返す合成シンボル・ルックアップを返します。それ以外の場合は、ほかの検索でシンボルを検索した結果を返します。- APIのノート:
- このメソッドは、複数のシンボル・ルックアップをまとめて連鎖するために使用できます。たとえば、シンボルを複数のライブラリから順番に取得できるようにするためです:
var lookup = SymbolLookup.libraryLookup("foo", arena) .or(SymbolLookup.libraryLookup("bar", arena)) .or(SymbolLookup.loaderLookup());
- パラメータ:
other
- この検索で見つからないシンボルの検索に使用するシンボル・ルックアップ- 戻り値:
- シンボルが見つかった場合、このルックアップでシンボルを検索した結果を返す合成シンボル・ルックアップ。それ以外の場合は、ほかのルックアップでシンボルを検索した結果を返します
-
loaderLookup
static SymbolLookup loaderLookup()呼び出し元クラス・ローダーに関連付けられたライブラリ内のシンボルのシンボル・ルックアップを返します。ライブラリは、
CL
で定義されるクラスのコードからSystem.load(String)
またはSystem.loadLibrary(String)
を呼び出してライブラリをロードすると、クラス・ローダーCL
に関連付けられます。 そのコードによってSystem.load(String)
またはSystem.loadLibrary(String)
がさらに起動される場合、より多くのライブラリがロードされ、CL
に関連付けられます。 このメソッドによって返されるシンボル・ルックアップは常に最新です: このメソッドが返された後にロードされた場合でも、関連するクラス・ローダーに関連付けられたすべてのライブラリが反映されます。クラス・ローダーに関連付けられたライブラリは、クラス・ローダーがunreachableになるとアンロードされます。 このメソッドによって返されるシンボル・ルックアップは、呼出し側のクラス・ローダーが到達可能な状態を維持する自動scopeに関連付けられます。 そのため、コール元のクラス・ローダーに関連付けられたライブラリは、そのクラス・ローダーまたはそれによって取得されたセグメントのいずれかのローダー・ルックアップがアクセス可能なかぎり、ロードされた(およびそれらのシンボルが使用可能)が保持されます。
スタック(例、JNIアタッチ・スレッドから直接コールされる場合)にコール元フレームがないコンテキストからこのメソッドがコールされる場合、コール元クラス・ローダーはデフォルトで「システム・クラス・ローダー」に設定されます。
- 戻り値:
- 呼び出し元のクラス・ローダーに関連付けられたライブラリ内のシンボルのシンボル・ルックアップ
- 関連項目:
-
libraryLookup
static SymbolLookup libraryLookup(String name, Arena arena) libraryLookup
は、Javaプラットフォームの制限付きメソッドです。制限されたメソッドは安全ではありません。不適切に使用した場合、JVMがクラッシュまたはメモリーが破損する場合があります。指定された名前 (まだロードされていない場合)のライブラリをロードし、そのライブラリ内のシンボルのシンボル・ルックアップを作成します。 返されるライブラリ・ルックアップの存続期間は、指定されたアリーナによって制御されます。 たとえば、提供されたアリーナが限定されたアリーナである場合、提供された限定されたアリーナがclosedの場合、返されたルックアップに関連付けられたライブラリはアンロードされます。- 実装上のノート:
- ライブラリ名の解決プロセスはOS固有です。 たとえば、POSIX準拠のOSでは、ライブラリ名はそのOSの
dlopen
関数の指定に従って解決されます。 Windowsでは、ライブラリ名はLoadLibrary
関数の指定に従って解決されます。 - パラメータ:
name
- シンボルを検索するライブラリの名前arena
- 返されたルックアップから取得されたシンボルに関連付けられたアリーナ- 戻り値:
- 指定された名前のシンボルをライブラリ内で検索するのに適した新しいシンボル・ルックアップ
- 例外:
IllegalStateException
-arena.scope().isAlive() == false
の場合WrongThreadException
-arena
が限定アリーナで、このメソッドがアリーナの所有者スレッド以外のスレッドT
からコールされる場合IllegalArgumentException
-name
が有効なライブラリを識別しない場合IllegalCallerException
- 呼び出し元が、ネイティブ・アクセスが有効になっていないモジュール内にある場合
-
libraryLookup
static SymbolLookup libraryLookup(Path path, Arena arena) libraryLookup
は、Javaプラットフォームの制限付きメソッドです。プログラムは、制限付きメソッドへのアクセスが有効になっている場合にのみlibraryLookup
を使用できます。制限されたメソッドは安全ではありません。不適切に使用した場合、JVMがクラッシュまたはメモリーが破損する場合があります。指定されたパス (まだロードされていない場合)からライブラリをロードし、そのライブラリ内のシンボルのシンボル・ルックアップを作成します。 返されるライブラリ・ルックアップの存続期間は、指定されたアリーナによって制御されます。 たとえば、提供されたアリーナが限定されたアリーナである場合、提供された限定されたアリーナがclosedの場合、返されたルックアップに関連付けられたライブラリはアンロードされます。- 実装上のノート:
- Linuxでは、このファクトリ・メソッドによって提供される機能および返されるシンボル・ルックアップは、
dlopen
、dlsym
およびdlclose
関数を使用して実装されます。 - パラメータ:
path
- シンボルを検索するライブラリのパスarena
- 返されたルックアップから取得されたシンボルに関連付けられたアリーナ- 戻り値:
- 指定されたパスを持つライブラリ内のシンボルを見つけるのに適した新しいシンボル・ルックアップ
- 例外:
IllegalStateException
-arena.scope().isAlive() == false
の場合WrongThreadException
-arena
が限定アリーナで、このメソッドがアリーナの所有者スレッド以外のスレッドT
からコールされる場合IllegalArgumentException
-path
がデフォルトのファイル・システムの有効なライブラリを指していない場合IllegalCallerException
- 呼び出し元が、ネイティブ・アクセスが有効になっていないモジュール内にある場合
-
libraryLookup
を使用できます。