2016-03-29 10 views
0

i jna verwenden 4.2.1 I ein Verfahren, in dem DLL, die einen Zeiger auf ein Objekt zurückgibt (C++)JNA 4.2.1 Aufruf dll Methode ohne params

basic_hash* getAlgorithmInstance(int algorithm) 

basic_hash hat die folgenden Verfahren (C++):

void reset(); 
void partial (const byte* data, uint64 size); 
void finalize (vector_byte& hash); 
void hash (const byte* data, uint64 size, vector_byte& hash). 

i haben Schnittstelle (Java)

public interface HAL extends Library { 
    HAL INSTANCE = (HAL) Native.loadLibrary(
    (Platform.isWindows() ? "HAL" : "libHAL"), HAL.class); 
    BasicHash getAlgorithmInstance(int i); 
} 
public static class BasicHash extends Structure { 
    public BasicHash() {} 
    public BasicHash(Pointer p) { 
    super(p); 
    read(); 
    } 
    @Override 
    protected List getFieldOrder() { 
    return Arrays.asList(new String[] { "reset", "hash", "partial", "finalize" }); 
    } 
    public interface Reset extends Callback { public void invoke();} 
    public Reset reset; 
    public interface Hash extends Callback {public void invoke(byte[] data, long size, byte[] hash);} 
    public Hash hash; 
    public interface Partial extends Callback {public void invoke(Pointer data, long size);} 
    public Partial partial; 
    public interface Finalize extends Callback {public void invoke(byte[] hash);} 
    public Finalize finalize; 
} 

und wenn ich die Methode ohne in Hauptparameter()

HAL lib = HAL.INSTANCE; 
BasicHash b = lib.getAlgorithmInstance(0); 
b.reset.invoke(); 

Ich erhalte eine Fehlermeldung:

Exception in thread "main" java.lang.Error: Invalid memory access 
    at com.sun.jna.Native.invokeVoid(Native Method) 
    at com.sun.jna.Function.invoke(Function.java:374) 
    at com.sun.jna.Function.invoke(Function.java:323) 
    at com.sun.jna.Function.invoke(Function.java:275) 
    at com.sun.jna.CallbackReference$NativeFunctionHandler.invoke(CallbackReference.java:646) 
    at com.sun.proxy.$Proxy1.invoke(Unknown Source) 
    at net.erver.ItServer.main(ItServer.java:79) 

Warum erhalten habe ich diesen Fehler, wenn die Methode die Variablen in der Bibliothek zurücksetzt? die Methode selbst erfüllt, ohne Probleme (laut Entwickler dll)

EDIT: vector_byte hat Definition:

typedef unsigned char byte; 
typedef std::vector<byte> vector_byte 

und basic_hash hat Definition:

namespace HAL { namespace algorithms { 
    HAL_HASH_API enum class State : byte { 
    Normal, 
    Finished, 
    }; 
    class HAL_HASH_API basic_hash 
    { 
    public: 
    virtual ~basic_hash() {} 
    virtual void reset() = 0; 
    virtual void partial(const byte*, uint64) = 0; 
    virtual void finalize(vector_byte&) = 0; 
    virtual void hash(const byte*, uint64, vector_byte&) = 0; 

    bool isFinished() { 
     return (_state == State::Finished ? true : false); 
    } 
    protected: 
     State _state; 
    }; 
} 
} 
+0

Bitte geben Sie die native Definition von 'basic_hash' und' vector_byte' an. – technomage

+0

danke für die Antwort vector_byte 'typedef unsigned char Byte; typedef std :: vector < byte > vector_byte' und basic_hash 'HAL_HASH_API Enum Klasse Zustand: Byte { Normal, Fertig, }; Klasse HAL_HASH_API basic_hash { öffentlich: virtual ~ basic_hash() {} virtueller void reset() = 0; Virtuelles void partially (const Byte *, uint64) = 0; virtuelles void finalisieren (vector_byte &) = 0; virtueller void-Hash (const Byte *, uint64, vector_byte &) = 0; bool isFinished() { Rückgabe (_state == Status :: Beendet? True: false); } }; ' – 6azbljlb

Antwort

0

Sie müssen Plain-Vanilla verwenden struct, um Daten zwischen JNA und Ihrer Bibliothek zu übertragen. Eine C++ - Klasse (einschließlich einer vector Vorlage) hat ein sehr unterschiedliches Speicherlayout als eine einfache C struct.

+0

danke @technomage, aber es ist nicht genug für diese' extern "C" HAL_HASH_API basic_hash * getAlgorithmInstance (int Algorithmus); '??? Diese externe Methoden-DLL. – 6azbljlb

+0

Das verhindert nur C++ - Namensfehlern in 'getAlgorithmInstance()'. Es wird immer noch einen Zeiger auf eine C++ - Klasse, nicht eine C-Struktur zurückgeben. – technomage

+0

danke @technomage – 6azbljlb