IntByReference返回0而不是实际值

时间:2015-11-20 07:10:29

标签: java eclipse native jna

我有以下C代码,我是从JNA调用的。当我调用它时,我得到0作为返回值,而当我在C中测试它时,我得到了真正的值。

RFIDLIB_API uint32_t get(
ipj_key key                         /*[i]*/,
uint32_t bank_index             /*[in]*/,
uint32_t value_index                        /*[out]*/,
uint32_t *value /*[out]*/)
{
return ipj_get(&iri_device,key,bank_index,value_index,value);

}

以下是我在JNA库中定义的方法。

public int get(ipj_key key, int bank_index, int value_index, IntByReference value);

下面是ip_key结构

public class ipj_key extends Structure {

public int ipj_key;

@Override
protected List getFieldOrder() {
    return Arrays.asList("ipj_key");
}

}

以下是我在主要方法中调用它的方式。

public rfidlib rlib;

public static void main(String[] args) {
    MainScannerTest mainClass = new MainScannerTest();
    mainClass.rlib = (rfidlib) Native.loadLibrary("rfidlib", rfidlib.class);

    ipj_key key = new ipj_key();
    key.ipj_key = 0xD;
    IntByReference value = new IntByReference();

    mainClass.rlib.get(key, 0, 0, value);
    System.out.println("Antenna power is : "+ value.getValue());

}

我在这里做错了什么?为什么我得到0作为返回值?请指教。

1 个答案:

答案 0 :(得分:0)

我的C lib有一个int*作为OUT参数。我也试图用它IntByReference,没有任何成功。

编辑2017-03-16:确实它适用于IntByReference。你的C代码可能有问题。

替代方案是使用Pointer代替IntByreference (我使用IntByRef和我的情况下的指针(64位Win7,JNA 4.3.0和Java 64位jdk 1.8.0_71))

使用您的代码段,这将如下所示。

首先更改您的JNA dll接口定义(使用Pointer而不是IntByReference):

public int get(ipj_key key, int bank_index, int value_index, /*change is here*/ Pointer value);

然后在调用之前更改变量:

Pointer value = new Memory(Integer.size); // Here we assume that your java platform is 32 bits (Integer.size=32)
//this should match your uint32_t. No idea if there are consequences when mixing 32/64 bits java/OS/dll ...

然后,您可以执行以下操作:

System.out.println("Antenna power is : "+ value.getInt(0));
// The offset is set to 0, since there is no reason to read the int from another offset value.