0
jnaを使用して変更できないdllのファサードオブジェクトがあります。 dllは内部状態を保持し、常に同じインスタンスである必要があります。 ファサードオブジェクトも状態を保持します。objectpointersをシミュレートする方法
私が正しく理解していれば、オブジェクトの非プリミティブを変更した場合、そのプリミティブへの内部ポインタが変更されたため、その変更は呼び出し元に戻されません。
すべての変更を保持するためにwrapperオブジェクトを渡すより良い方法はありますか? 例えば:会員クラスとバイト配列にmethodAとBの後に変更を反映pointerSimを目標に
public class Facade
{
private final Dll dll;
public Facade(int foo, int bar)
{
//init the Facade
this.dll = new Dll();
}
int foo(int bar)
{}
// more methods
}
public class Wrapper
{
public final Facade facade;
public Wrapper(Facade facade)
{
this.facade = facade;
}
}
public static class App
{
public static int main(String[] args)
{
Facade fac = new Facade(0,0);
Wrapper pointerSim = new Wrapper(fac);
methodA(pointerSim);
methodB(pointerSim);
}
}
。
私の偽りは間違っていますか?
JNAを使用して独自のポインタ型を作ることができるが、一般的に(ネイティブ側に変更される可能性のフィールドを識別するために、 'volatile'キーワードを使用しています別のスレッド)。これらのフィールドを一般的な同期メソッド( 'read()/ write()')に書くことは避けられますが、 'writeField()'で書き込みを行うことができます。 – technomage
また、一般的な 'Pointer'(またはあなた自身の' PointerType'を使用することで、型の安全性を保つことができます)を使用して、メモリアクセサーメソッドを使用して必要に応じてデータをプッシュ/プルすることもできます。 – technomage
@technomageこれでもう少し拡張していただけますか? – gismo