当前位置: 首页 > 知识库问答 >
问题:

从JNA调用读取String[]失败

乜胜泫
2023-03-14

根据文件,结构如下:

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**的结构字段?

共有1个答案

上官华池
2023-03-14

自我回答,因为我在挖掘后发现了它。

主要突破是这个工具: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中,您应该使用闭包