我有以下从JNA调用的C代码。当我调用它时,我在C中进行测试时得到的返回值为0,而我得到的是实际值。

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作为返回值?请指教。

最佳答案

我的C库有一个int*作为OUT参数。我也试图将它与IntByReference一起使用,但没有成功。

编辑2017-03-16:实际上它与IntByReference一起使用。您的C代码中可能存在我某些错误。

另一种选择是使用Pointer代替IntByreference
(在我的情况下,我使其与IntByRef以及Pointer一起使用(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.

09-07 17:57