我有以下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作为返回值?请指教。
答案 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.