2016-09-22 143 views
0

我hava一個DLL的外觀對象,我不能用jna修改。 該DLL保持內部狀態,並應始終是相同的實例。 立面對象保持狀態。如何模擬objectpointers

如果我理解正確,如果我更改了對象的非原語,則該更改將不會返回給調用者,因爲指向該非原語的內部指針可能已更改。

有沒有更好的方式,然後繞過一個wrapperobject保持所有的變化? 例如:

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); 
    } 
} 

隨着pointerSim的反射之後了methodA向會員類和字節數組的變化和B的目標。

或者我的僞裝是假的?

+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) { } 
}