- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想使用 JNA 在 Java 中调用 Linux mount 命令,并从调用结果中填充挂载点列表,但无法理解接口(interface)方法的实际返回类型。
如果我使用 int 那么它会打印 -1 而不会出现任何错误。我认为这表明存在某种错误。
public class MountTest {
private interface CLibrary extends Library {
String[] mount();
}
public static void main(String[] args) {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
System.out.println(INSTANCE.mount());
}
}
我尝试根据以下文档使用不同的返回类型,但没有任何效果。
我认为我的问题是基于
的签名不正确My library sometimes causes a VM crash: Double check the signature of the method causing the crash to ensure all arguments are of the appropriate size and type. Be especially careful with native pointer variations. See also information on debugging structure definitions.
有人可以帮我解决这个问题吗?我应该使用什么返回类型,以便我可以访问挂载点列表。
更新:我能够通过调整代码来运行 Linux 命令,如下所示:
public class MountTest {
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int runCommand(String cmd);
}
public static void main(String[] args) {
CLibrary.INSTANCE.runCommand("mount");
}
}
现在的问题是,它打印到标准输出。我不知道如何使用 JNA 从 stdout 读取结果
最佳答案
作者:mount文档
mount() attaches the filesystem specified by source (which is often a pathname referring to a device, but can also be the pathname of a directory or file, or a dummy string) to the location (a directory or file) specified by the pathname in target.
这意味着mount
系统调用只是挂载目录,它与the mount command不同。 。您可能正在寻找getmetent ,它将列出所有文件系统挂载点,实现如下:
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
Pointer fopen(String name, String mode);
Mount.ByReference getmntent(Pointer FILE);
}
public static void main(String[] args) {
final Pointer mountFile = CLibrary.INSTANCE.fopen("/etc/mtab", "r");
if (mountFile == null) {
System.err.println("File not exists: " + mountFile);
return;
}
Mount.ByReference mpoint;
while ((mpoint = CLibrary.INSTANCE.getmntent(mountFile)) != null) {
System.out.println(mpoint);
}
}
public static class Mount extends Structure {
public String mnt_fsname;
public String mnt_dir;
public String mnt_type;
public String mnt_opts;
public int mnt_freq;
public int mnt_passno;
@Override
protected List getFieldOrder() {
List<String> fieds = new ArrayList<>();
for (final Field f : Mount.class.getDeclaredFields()) {
if (!f.isSynthetic())
fieds.add(f.getName());
}
return fieds;
}
public static class ByReference extends Mount implements Structure.ByReference {
}
}
观察: 据我所知,你不能从 JNA 调用编译后的程序,只能调用库函数和系统调用,然后不可能调用 mount 命令,如果你真的想使用这个命令,那么你可能需要使用 Runtime.getRuntime().exec
或类似的东西。
更新
看看this answer在那里您可以区分什么是程序以及什么是系统调用或库函数
关于java - 如何使用 JNA 读取 Linux 命令的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46677204/
我正在使用 JNA 加载 native 库: MyLibrary INSTANCE = (MyLibrary) Native.loadLibrary("mylibrary.so", MyLibrary
任何人都可以为我提供一个 JNA 鼠标钩子(Hook)的工作示例,它能够在我的 Java Swing 应用程序之外跟踪鼠标移动/单击吗? 提前致谢 最佳答案 是的,这里是代码... public cl
我在哪里可以获得支持 ARM64 的 JNA 库? com.sun.jna_4.jar 包含适用于 ARM 的 native libjnidispatch.so 库,但不包含适用于 ARM64 的库。
我正在尝试使用 JNA,因为我想使用一个用 c++ 编写的 .dll,而我的其余代码是用 Java 编写的。但是,如果我尝试导入 JNA 类 Eclipse 声称“com.sun.jna.Librar
我使用以下代码从java程序控制Windows服务 public class PostgresService2 { public static void main(String[] args)
我有一个用于 C 函数 mpv_set_option_string 的 JNA Java 接口(interface),定义为: public interface MPV extends StdCall
我正在查看中央 Maven 存储库,并看到一个 net.java.dev.jna 和一个用于 JNA 的 com.sun.jna groupId。 JNA 的 github,使用 com.sun.jn
我已经开始构建一个 java 服务,它结合了 JNA 来加载 native C/C++ 库,我想在 Raspberry PI aka arm 平台上运行 java 服务。我已经成功地建立了一个稳定的服
我要离开 this如何传递 com.sun.jna.Structure 的示例包含 com.sun.jna.StringArray使用 JNA 从 Java 转换为 native C 代码,并且无法在
我正在准备 spring-boot 应用程序。然后我得到以下错误: JNA not found. native methods will be disabled. java.lang.ClassNot
遇到令人抓狂的阻塞错误: Exception in thread "main" java.lang.Error: Structure.getFieldOrder() on class com.luke
我已经下载并复制 Jna.jar 和 Platform.jar 到/usr/cassandra/apache-cassandra-1.0.7/lib 文件夹,但在 Cassandra 启动时仍然看到以
我有一个像这样的 JNA 库 stub : public interface FREngine extends Library { NativeLibrary JNA_NATIVE_LIB =
我想使用 JNAerator 为 JNA 生成一些 C++ API 函数的 Java 包装器。问题是我无法在工作时使用 JNAerator Studio 或从我的 PC 访问 Github。我只有 G
在 JNA 中,如何从 Xlib 映射联合结构,如以下 XEvent typedef union _XEvent { int type; /* must not be changed *
我正在尝试使用 JNA 从 java 运行 ShellExecute 函数。我在非 unicode 文件夹上运行 ShellExecuteA 没有任何问题 import com.sun.jna.*;
在弄清楚如何将 ClientToScreen winapi 函数与 JNA 结合使用时遇到问题。 我仍然得到窗口句柄坐标的 0, 0 输出。我引用了这个,但我确信我做得不对 https://msdn.
我有两个局部变量: Pointer output; int output_len; /* or better `size_t output_len;` */ 我需要将这些变量的指针传递到 JNA 函数
我有一个openvr binding有一段时间以来有一个小问题 基本上,每当我释放某些几何 3D 模型(基站或 Controller )的内存时,我都会时不时地收到错误: "java.lang.Err
我是 JNA 新手,我想将 DsGetDcName 方法转换为 JNA。 DWORD DsGetDcName( __in LPCTSTR ComputerName, __in LPCT
我是一名优秀的程序员,十分优秀!