【问题标题】:JNA how call a method from java in an Pointer received from dll?JNA如何在从dll接收的指针中调用java中的方法?
【发布时间】:2016-03-28 14:05:57
【问题描述】:

我在 dll 中有一个方法,它返回一个指向对象的指针

C 代码

basic_hash* getAlgorithmInstance( int algorithm )

对象有以下方法:

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

如何调用这个对象的方法?

我有一个返回指针的实现

java代码

public interface LIB extends Library {
        LIB INSTANCE = (LIB ) Native.loadLibrary(
                (Platform.isWindows() ? "LIB " : "linuxLIB"), LIB.class);
        Pointer getAlgorithmInstance(int i);
    }

    public static void main(String[] args) {
        try {
            LIB lib = LIB.INSTANCE;
            Pointer pointer = lib.getAlgorithmInstance(0);
            //pointer.reset(); //TODO how call?
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
    }

【问题讨论】:

  • C 中没有“对象”之类的东西。您的函数很可能返回一个结构指针 (struct*)。向我们展示basic_hash 的定义,并查找对Callback 或“函数指针”的JNA 引用。
  • basic_hash - 它是下一个方法的接口:void reset ();无效部分(常量字节*数据,uint64大小); void finalize (vector_byte& hash); void hash (const byte* data, uint64 size, vector_byte& hash)。

标签: java pointers dll native jna


【解决方案1】:

您需要为每个函数指针声明回调。这是“重置”的示例。

public class BasicHash extends Structure {
    public interface Reset extends Callback {
        public void invoke();
    }
    public Reset reset;
    public BasicHash() { }
    public BasicHash(Pointer p) { super(p); read(); }
}

BasicHash hash = mylib.getAlgorithmInstance(0);
hash.reset.invoke();

【讨论】:

  • 如果我调用我重置VM下降,它下降dll曲线或错误调用?
  • # JRE version: Java(TM) SE Runtime Environment (7.0_79-b15) (build 1.7.0_79-b15) # Java VM: Java HotSpot(TM) Client VM (24.79-b02 mixed mode windows-x86 ) # Problematic frame: # C [HAL.dll+0x5524]
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多