java从JNA调用读取字符串[]失败
我正试图通过JNA调用以下函数:
struct group * getgrnam (const char *name)
如中所述: http://www.gnu.org/software/libc/manual/html_node/Lookup-Group.html#Lookup-Group
根据文件,结构如下:
char *gr_name
The name of the group.
gid_t gr_gid
The group ID of the group.
char **gr_mem
A vector of pointers to the names of users in the group. Each user name is a null-terminated string, and the vector itself is terminated by a null pointer.
我创建了以下简单的测试类
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class Test {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
void printf(String format, Object... args);
public Group getgrnam(String groupName);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
Group group = CLibrary.INSTANCE.getgrnam(args[0]);
System.out.println(group.gr_name);
System.out.println(group.gr_mem);
}
}
以及表示结构的组类:
import java.util.ArrayList;
import java.util.List;
import com.sun.jna.Structure;
public class Group extends Structure {
public String gr_name;
public int gr_gid;
public String[] gr_mem = new String[128];
@Override
protected List<String> getFieldOrder() {
List<String> fields = new ArrayList<>();
fields.add("gr_name");
fields.add("gr_gid");
fields.add("gr_mem");
return fields;
}
}
marshalling documentation of JNA表示字符**已转换为字符串[]
但是,当我运行此代码时,会出现以下错误:
/tmp # java -cp .:jna-4.5.1.jar Test root Hello, World Exception in thread "main" java.lang.IllegalArgumentException: Reading array of class java.lang.String from memory not supported at com.sun.jna.Pointer.readArray(Pointer.java:538) at com.sun.jna.Pointer.getValue(Pointer.java:459) at com.sun.jna.Structure.readField(Structure.java:720) at com.sun.jna.Structure.read(Structure.java:580) at com.sun.jna.Structure.autoRead(Structure.java:2074) at com.sun.jna.Structure.conditionalAutoRead(Structure.java:550) at com.sun.jna.Function.invoke(Function.java:446) at com.sun.jna.Function.invoke(Function.java:354) at com.sun.jna.Library$Handler.invoke(Library.java:244) at com.sun.proxy.$Proxy0.getgrnam(Unknown Source) at Test.main(Test.java:23)
如何正确转换char**的结构字段
# 1 楼答案
自我回答,因为我在挖掘后发现了它
主要突破是这个工具:https://github.com/nativelibs4java/JNAerator
它从C结构生成Java类,这非常有帮助
最终,正确映射组结构的Java类如下所示:
gr_mem字段(C中的字符**类型)使用PointerByReference是一个突破
之后可以这样读: