2016-09-22 21 views
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); 
    } 
} 

私の偽りは間違っていますか?

+0

JNAを使用して独自のポインタ型を作ることができるが、一般的に(ネイティブ側に変更される可能性のフィールドを識別するために、 'volatile'キーワードを使用しています別のスレッド)。これらのフィールドを一般的な同期メソッド( 'read()/ write()')に書くことは避けられますが、 'writeField()'で書き込みを行うことができます。 – technomage

+0

また、一般的な 'Pointer'(またはあなた自身の' PointerType'を使用することで、型の安全性を保つことができます)を使用して、メモリアクセサーメソッドを使用して必要に応じてデータをプッシュ/プルすることもできます。 – technomage

+0

@technomageこれでもう少し拡張していただけますか? – gismo

答えて

1

単純なPointerを使用してネイティブオブジェクトを渡すことができます。そのクラスには、基本ポインタからメモリへのオフセットを読み取るためのいくつかのアクセサメソッドがあります。あなたは、ポインタの特定のクラスの周りの安全を入力したい場合は

、あなたが

public class Facade extends PointerType { 
    public Facade() { } 
    public Facade(Pointer p) { } 
} 
関連する問題