我有以下从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.