JNA 4.2.1调用不带参数的dll方法

时间:2016-03-29 15:10:14

标签: java memory dll jna

我使用jna 4.2.1 我在dll中有一个方法,它返回一个指向对象的指针(C ++)

basic_hash* getAlgorithmInstance( int algorithm )

basic_hash具有以下方法(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).

我有界面(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;
}

当我在main()

中使用没有参数的方法时
HAL lib = HAL.INSTANCE;
BasicHash b = lib.getAlgorithmInstance(0);
b.reset.invoke();

我收到错误:

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)

如果方法重置库中的变量,为什么会收到此错误?方法本身没有问题(根据开发人员dll)

修改 vector_byte有定义:

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

和basic_hash有定义:

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

1 个答案:

答案 0 :(得分:0)

您需要使用普通的香草struct在JNA和您的库之间传递数据。 C ++类(包括vector模板)与简单的C struct具有完全不同的内存布局。