JNA 相关问题
结构体对齐问题
要注意调用的c库字段对齐方式的相关设置。
#pragma pack (push,1)
#pragma pack(pop)
jna中提供了4种对齐方式:
/** Use the platform default alignment. */
public static final int ALIGN_DEFAULT = 0;
/** No alignment, place all fields on nearest 1-byte boundary */
public static final int ALIGN_NONE = 1;
/** validated for 32-bit x86 linux/gcc; align field size, max 4 bytes */
public static final int ALIGN_GNUC = 2;
/** validated for w32/msvc; align on field size */
public static final int ALIGN_MSVC = 3;
需要在相应的结构体构造函数中加入super(ALIGN_NONE);
设置对应的对齐方式。
unsigned类型处理
java中没有对应的无符号类型,需要进行相应的转换,以byte类型为例(c中的 unsigned char)
public class Util {
public static byte sendUnsignedByte(int input){
return (byte) (input & 0xFF);
}
public static int receiveUnsignedByte(byte input){
return input & 0xFF;
}
}
char*
const char* 作为函数参数,可以直接用字符串String
传值。
char** 函数回传字符串。用PointerByReference
char** 发送数据到struct的char**
类型的字段中:new StringArray(String[] strings);
获取struct中的char**
类型回传的数据: String[] getStringArray(long offset, int length)
final PointerByReference ptrRef = new PointerByReference();
final Pointer p = ptrRef.getValue();
final String val = p.getString(0);
获取数据,内存由c分配,那么需要c同时提供jni接口释放获取到的内存。
发送数据:
String strInfo = "very nice";
byte[] bInfo = strInfo.getBytes();
Memory info = new Memory(bInfo.length + 1);
info.clear();
info.write(0,bInfo,0,bInfo.length);
info.setByte(bInfo.length,(byte)0);
p.info = info;
struct 数组
获取数据,要调用c的接口释放分配的内存
传递数组到c:
关键方法:public Structure[] toArray(int size)
用于在java中分配内存,和把c中获取的内存空间转化为Structure
数组.
callback
typedef void(*callback)(PERSON*);
public static class ShowCallBack implements Callback{
public void invoke(Person.ByReference person){
String name = "";
byte[] data = person.name;
int count = data.length;
for(int i=data.length - 1;i>= 0;i--){
if(data[i] != 0) {
break;
}
count--;
}
if(count > 0) {
byte[] copy = new byte[count];
System.arraycopy(data,0,copy,0,count);
name = new String(copy);
}
System.out.println("callback name "+name);
}
}
用byte[]数组值给char[]
由于c中字符串以