2016-03-29 1 views
0

i utiliser jna 4.2.1 j'ai une méthode dans la DLL qui renvoie un pointeur vers un objet (C++)JNA méthode dll appel 4.2.1 sans params

basic_hash* getAlgorithmInstance(int algorithm) 

basic_hash a les méthodes suivantes (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 ai interface (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; 
} 

et quand on utilise le procédé sans paramètres principaux()

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

je reçois une erreur:

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) 

Pourquoi ai-je reçu cette erreur si la méthode remet à zéro les variables de la bibliothèque? la méthode se réalise sans problème (selon les développeurs dll)

EDIT: vector_byte a Définition:

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

et basic_hash a définition:

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

Veuillez inclure la définition native de 'basic_hash' et' vector_byte'. – technomage

+0

merci pour la réponse vector_byte 'typedef unsigned char byte; typedef std :: vector < byte > vector_byte' et basic_hash État classe 'HAL_HASH_API ENUM: octet { Normal, fini, }; class HAL_HASH_API basic_hash { public: virtual ~ basic_hash() {} virtual vide réinitialisation() = 0; vide virtuel partiel (const byte *, uint64) = 0; virtual void finalize (vector_byte &) = 0; hachage de vide virtuel (const byte *, uint64, vector_byte &) = 0; bool isFinished() { return (_state == État :: Terminé? Vrai: faux); } }; ' – 6azbljlb

Répondre

0

Vous devez utiliser vanilles struct pour transmettre des données entre JNA et votre bibliothèque. Une classe C++ (y compris un modèle vector) a une disposition de mémoire très différente de celle d'un simple C struct.

+0

merci @technomage, mais il ne suffit pas pour ce' extern 'C "HAL_HASH_API basic_hash * getAlgorithmInstance (algorithme int); Cette DLL de méthode externe. – 6azbljlb

+0

Cela empêche seulement le changement de nom C++ sur 'getAlgorithmInstance()'. Il retournera toujours un pointeur vers une classe C++, pas une structure C. – technomage

+0

merci @technomage – 6azbljlb