为什么在调用带有回调的方法时我没有得到任何输出?
why am I not getting any output when a method with a callback is called?
我正在尝试通过 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);
}
当我 运行 代码时,不会打印任何内容。甚至字符串 "result is" 也不行。我在这里做错了什么?请指教
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
.
JNA 的最新文档可在 github project 中找到。
我正在尝试通过 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);
}
当我 运行 代码时,不会打印任何内容。甚至字符串 "result is" 也不行。我在这里做错了什么?请指教
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
.
JNA 的最新文档可在 github project 中找到。