【问题标题】:why am I not getting any output when a method with a callback is called?为什么当调用带有回调的方法时我没有得到任何输出?
【发布时间】:2015-11-12 11:10:19
【问题描述】:

我正在尝试通过 Java 调用 C DLL 中的方法。但我没有得到任何输出,也没有任何异常。下面是我的 C 代码。

typedef void (*rfid_data)(
    uint32_t data_id,
    uint32_t data_length,
    char *data  );


RFIDLIB_API uint32_t init(
    char *csvParams                 /*[in]*/,
    uint32_t length                 /*[in]*/,
    rfid_data callbackFunction);

下图是我的回调相关的JAva接口。

public interface rfid_data extends Callback{

public void callback(int dataId,int dataLength,Pointer data);

}

下面是我的库界面。

public interface rfidlib extends Library{

public int init(Pointer csvParams,int length,rfid_data callbackFunction);

}

下面显示的是我调用 C 代码的主要方法。

public class MainClass {

public rfidlib rlib;

public static void main(String[] args) {
    MainClass mainClass = new MainClass();

    mainClass.rlib = (rfidlib) Native.loadLibrary("rfidlib", rfidlib.class);
    rfid_data rfidData = new rfid_data() {
        @Override
        public void callback(int dataId, int dataLength, Pointer data) {
            byte[] buffer = data.getByteArray(0,dataLength);
            System.out.println("Data Id is : " + dataId + "Data Length is : " + dataLength + " data is : " + new String(buffer));

        }
    };
    String comPort = "COM4";
    Pointer m = new Memory(comPort.length()+1);
    m.setString(); 
    int result1 = mainClass.rlib.init(m, 100, rfidData);
    System.out.println("result is : "+result1);


}

当我运行代码时,什么都没有打印出来。甚至没有字符串“结果是”。我在这里做错了什么?请指教。

【问题讨论】:

    标签: java eclipse callback native jna


    【解决方案1】:

    char* 暗示 Pointer,而不是 String。您的回调正在接收指向数据的指针,大概是一个字节数组。除非您的文档另有说明,否则您不应假设传入的数据是一个以 NUL 结尾的 C 字符串(因为传入了长度,我非常怀疑它是一个可打印的字符串)。如果您确定它 C 字符串,则使用函数Pointer.getString(0) 将其转换为Java 字符串。

    public interface rfid_data extends Callback{
        public void callback(int dataId, int dataLength, Pointer data);
    }
    
    rfid_data cb = new rfid_data() {
        public void callback(int dataId, int dataLength, Pointer data) {
            byte[] buffer = data.getByteArray(0, dataLength);
            // Alternatively, if the incoming data is a NUL-terminated C string
            String s = data.getString(0);
            // ...
        }
    };
    

    编辑

    如果 RFIDLIB_API 宏包含 stdcall(很可能),那么您的库还应该实现 StdCallLibrary 和您的回调 StdCallCallback

    可在github project 找到 JNA 的最新文档。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多