根据文件,结构如下:
char*GR_NAME
组的名称。
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;
}
}
/tmp#java-cp.:jna-4.5.1.jar测试root Hello,线程“main”java.lang.IllegalArgumentException:在com.sun.jna.pointer.ReadArray(pointer.java:538)在com.sun.jna.pointer.GetValue(pointer.java:459)在com.sun.jna.structure.ReadField(structure.java:720)在com.sun.jna.structure.Read(structure.java:580)java:550)在com.sun.jna.function.invoke(function.java:446)在com.sun.jna.function.invoke(function.java:354)在com.sun.jna.library$handler.invoke(library.java:244)在com.sun.proxy.$proxy0.getgrnam(未知来源)在Test.main(Test.java:23)
如何正确转换Char**的结构字段?
自我回答,因为我在挖掘后发现了它。
主要突破是这个工具:https://github.com/nativelibs4java/jnaerator
它从C结构生成Java类,这很有帮助!
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.ptr.PointerByReference;
import java.util.Arrays;
import java.util.List;
/**
* <i>native declaration : line 2</i><br>
* This file was autogenerated by <a href="http://jnaerator.googlecode.com/">JNAerator</a>,<br>
* a tool written by <a href="http://ochafik.com/">Olivier Chafik</a> that <a href="http://code.google.com/p/jnaerator/wiki/CreditsAndLicense">uses a few opensource projects.</a>.<br>
* For help, please visit <a href="http://nativelibs4java.googlecode.com/">NativeLibs4Java</a> , <a href="http://rococoa.dev.java.net/">Rococoa</a>, or <a href="http://jna.dev.java.net/">JNA</a>.
*/
public class Group extends Structure {
/**
* Group name.<br>
* C type : char*
*/
public Pointer gr_name;
/**
* Password.<br>
* C type : char*
*/
public Pointer gr_passwd;
/**
* Group ID.<br>
* C type : __gid_t
*/
public int gr_gid;
/**
* Member list.<br>
* C type : char**
*/
public PointerByReference gr_mem;
public Group() {
super();
}
protected List<String> getFieldOrder() {
return Arrays.asList("gr_name", "gr_passwd", "gr_gid", "gr_mem");
}
/**
* @param gr_name Group name.<br>
* C type : char*<br>
* @param gr_passwd Password.<br>
* C type : char*<br>
* @param gr_gid Group ID.<br>
* C type : __gid_t<br>
* @param gr_mem Member list.<br>
* C type : char**
*/
public Group(Pointer gr_name, Pointer gr_passwd, int gr_gid, PointerByReference gr_mem) {
super();
this.gr_name = gr_name;
this.gr_passwd = gr_passwd;
this.gr_gid = gr_gid;
this.gr_mem = gr_mem;
}
public Group(Pointer peer) {
super(peer);
}
protected ByReference newByReference() { return new ByReference(); }
protected ByValue newByValue() { return new ByValue(); }
protected Group newInstance() { return new Group(); }
// public static Group[] newArray(int arrayLength) {
// return Structure.newArray(Group.class, arrayLength);
// }
public static class ByReference extends Group implements Structure.ByReference {
};
public static class ByValue extends Group implements Structure.ByValue {
};
}
public static void main(String[] args) {
Group group = CLibrary.INSTANCE.getgrnam(args[0]);
System.out.println(group.gr_name.getString(0));
PointerByReference pbr = group.gr_mem;
String[] groups = pbr.getPointer().getStringArray(0);
for (String g : groups) {
System.out.println(g);
}
jna 中 structure 结构体怎么读取, 在回调函数中 我收到对方返回一个 pointer 是海康的sdk NET_DVR_SetDVRMessageCallBack_v50 的回调函数 有个 pAlarmInfo:Pointer 类型, 想接收为 NET_DVR_ACS_ALARM_INFO 类型, 要怎么做 我试过这样读取, 但没有讲到到
我有一个困扰了我好几天的问题。。。我检查了类似的问题,但没有找到解决方案。 我使用NetBeans IDE。我建立项目jar文件,即“Clock.jar”,其中包含一个“时钟”命名文件夹,其中发现了一些图像、文本文件和所有项目类。下面的代码创建一个图像图标工作 但是下面读取文本文件的代码失败 正如您可能猜到的那样,引发了NullPointer异常,这意味着它可能找不到文件。 但是,为什么图像图标构
问题内容: 望回到发展空间;主要使用Java调用某些本地win32函数(我不希望在.NET中构建)…。 有人可以指向我一个可以使用Java(JNI / JNA / SWIG)从不同的运行窗口中读取标题的地方。假设您知道要尝试挂接到的应用程序在内存空间中的哪个位置。 问题答案: JNA中: 要使用它: 您可能需要为HWND使用适当的结构映射,并允许unicode支持。您可以在JNA网站上找到该信息以
我想在Java使用JNA调用Linux mount命令,并从调用结果填充一个装入点列表,但无法理解接口方法的实际返回类型应该是什么。 如果我使用int,那么它将没有任何错误地打印-1。我认为这是某种错误的迹象。 } 我尝试使用基于以下文档的不同返回类型,但没有任何工作。 默认类型映射 我想我的问题是基于错误的签名 我的库有时会导致VM崩溃:仔细检查导致崩溃的方法的签名,以确保所有参数的大小和类型都
我正在运行一个cron作业,它执行用于读取gmail的python脚本(2分钟间隔)。我使用imaplib阅读新邮件。直到昨天,这一直工作正常。突然它抛出了错误 imaplib.error:[AUTHENTICATIONFAILED]无效的凭据(失败) 有时我得到以下错误 当我在不同的机器上运行相同的脚本时。它工作正常。我假设主机已被列入黑名单或类似的东西。 我有什么选择?
问题内容: 从名称(以String格式)中调用方法有时会很有用。 在Swift中,建议更改行为并使用闭包“动态”地进行操作,例如,您可以拥有一个函数字典,名称为键,实现为值。 但是,有时您只想简单地知道“怎么做”,这就是这个问题的原因。 那么,如何从名称作为字符串开始动态调用Swift方法? 在目标C中很简单: 但是在Swift中被禁止 还有其他选择吗? 问题答案: 在Swift中,您应该使用闭包