ゲーム アプリに (メイン スレッド以外に) 2 つのスレッドがあるとします。
- GLRenderer スレッド (Android が提供
GLSurfaceView.Renderer
) - 別スレ(ゲームスレ)
どちらのスレッドも JNI を使用して、アプリの特定の C++ (つまり Android NDK) コンポーネントを呼び出します。
Javaで直接IntBuffer
割り当てられていると仮定します(たとえば、GLRendererスレッドからですが、これを想定しないでください)。事実:
- このダイレクト バッファは、GLRenderer スレッドからのネイティブ コードによって (つまり、JNI 経由で呼び出される C++ コンポーネントによって)読み取られます。
- このダイレクト バッファは、別のスレッド (ゲーム スレッド) から書き込まれることがあります。
次の 2 つのシナリオで、同期 (実際にはデータの可視性を確保する) の (最善の) 方法は何IntBuffer
ですか?
- シナリオ #1: ゲーム スレッドの Java コードが
IntBuffer
(たとえば 経由でIntBuffer.put()
)に書き込みます。 - シナリオ #2: ゲーム スレッドから呼び出されたネイティブ コードが
IntBuffer
標準の Java 同期は両方のケースで機能すると考えていました。
public void onDrawFrame(GL10 gl) { // the GLRenderer thread
// ...
synchronized (obj) {
callNativeCode1(); // a JNI call; this is where the C++ native code reads the IntBuffer
}
}
public void run() { // the game thread
// ...
synchronized (obj) {
intBuffer.put(...); // writing the buffer from managed code
}
// ...
synchronized (obj) {
callNativeCode2(); // a JNI call; writing the buffer from C++ native code
}
}