現在、ヒープメモリからフィールド値をコピーできるように、JNIを使用してメモリ内のフィールドのオフセットを取得しようとしています。フィールドのjFieldIDを使用してインスタンスフィールドのオフセットを取得できました。 jFieldIDの最上位30ビットは、インスタンスフィールドのフィールドのオフセットを表します。問題は静的フィールドにあります。 30ビットはJNIid *を表します。 JNIidは、おそらくフィールドのオフセットであるintオフセットフィールドを含む構造体です。今私の問題は、この価値をどうやって得るのかということです。私は、これはしかし、私は任意の値を与えていない静的フィールドのJNIフィールドID
uintptr_t result = (uintptr_t) id >> address_shift;
// offset field in JNIid struc is in offset 16
jlong staticFieldoffsetAddress = result + 16;
jint* staticFieldValuePointer = (jint*) staticFieldoffsetAddress;
(IDフィールドのjfieldIDであり、address_shiftが2であると仮定して)次のコードスニペットを使用しました。私はそれが私がUnsafe.staticFieldOffset(Field)から得たものと比較しているので、正しいものではない0を得る。私はJNIからこのメソッドを呼び出して結果を使用できることを知っています。しかし、私はそれがパフォーマンス重視のアプリケーションのために必要です。
を実行JNIは、フィールドの値を読み取るための機能を提供します。特定のJNI実装をリバースエンジニアリングするのではなく、これらを使用することを強くお勧めします。 –
はい、私は知っていますが、フィールド値を1つずつコピーしたくありません。だから私は最小のオフセットと最大値を取得し、コピーメモリをしたいと思います。 –
@MohamedOmerなぜメモリ内のオフセットが変わらないと思いますか? –