Articles of JNA

Java JNA读取进程内存Linux

我试图让一个Java库来读/写内存值到Linux上的进程。 每次我读取一个值, ptrace返回-1,我每次读取一个不同的int。 这是我的主要类代码: public final class Main { public static void main(String… args) { // 10702 ? 00:00:00 idea.sh Memory buffer = new Memory(4); System.out.println(ptrace.ptrace(1, 10702, new Pointer(0x7f1f80e81fb8L), buffer)); System.out.println(buffer.getInt(0)); } } 输出: -1 2014720320 这是我的ptrace类: public class ptrace { static { Native.register(NativeLibrary.getInstance("c")); } public static native long ptrace(/*enum __ptrace_request*/ int request, /*pid_t*/ int […]

使用JNA for sched_setaffinity

使用作为参考我写了一些代码手动设置线程的优先级(用于学习的目的)。 我正在使用下面的代码: final IntByReference cpuset = new IntByReference(1); final int ret = lib.sched_setaffinity(0,(16),cpuset); System.out.println(ret); 我编译Java代码如下: – javac -classpath jna-4.0.0.jar JNATestOne.java 我得到以下错误: – JNATestOne.java:27: error: cannot find symbol final int ret = lib.sched_setaffinity( 0, cpuMaskSize, new LongByReference( mask ) ); ^ symbol: method sched_setaffinity(int,int,LongByReference) location: variable lib of type CLibrary 我究竟做错了什么?

支持在Linux中设置ACL

从Java 7开始,我可以使用类似下面的代码来为文件设置ACL: java.nio.file.Path file = Paths.get(filePath); java.nio.file.attribute.GroupPrincipal joe = file.getFileSystem().getUserPrincipalLookupService() .lookupPrincipalByGroupName(groupid); AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class); java.nio.file.attribute.AclEntry entry = java.nio.file.attribute.AclEntry.newBuilder() .setType(AclEntryType.ALLOW) .setPrincipal(joe) .setPermissions(aclEntryPermissions) .build(); List<java.nio.file.attribute.AclEntry> acl = view.getAcl(); acl.add(entry); view.setAcl(acl); 但是这个代码不会运行在Linux上(对Windows和Solaris运行良好)。 原因似乎是因为AclFileAttributeView在Linux中不受支持。 我的问题是: 有什么版本的Java在Linux中支持AclFileAttributeView ? 如果答案是否定的,那么有人可以共享一个示例JNA代码,或者给我一些指向我需要在Linux中使用的Native API的指针来使其运行。 实际上我想要的function类似于setfacl和getfacl命令行。

如何在Java和Solaris上获得所有正在运行的进程的列表?

有没有人知道如何获得在Linux和Solaris上与Java的所有正在运行的进程的列表? 我不想使用外部程序,如ps,我不想使用proc。 我想用本地电话来完成。 我find了使用JNA的Windows的一种方法。 但是这种方式在Linux和Solaris上不起作用。

使用JNA优于stream程执行的优势

我有一个项目,目前使用java.lang.Process执行许多外部程序。 假设它们的function也是以本地库forms提供的,那么使用JNA执行所述库函数的好处是什么呢? stream程执行相当繁重 – 需要几秒钟才能完成。 我认为性能增益最小是否正确?

如何使用.dll和.so中的JNA具有相同的callback签名

我正在开发一个在Windows和Linux上运行的java项目,并且我正在使用第三方共享库,这两个操作系统都有相同的方法签名。 但是,dll的调用约定是stdcall,而共享对象是cdecl。 我想避免重复的callback代码,两个接口和两个类,每个调用约定一个接口。 我想为callback函数编写一个单一的代码。 那可能吗? 在linux下访问.so的代码中唯一的变化就是界面。 callback函数代码本身是相同的。 我会感激任何消化。 import com.sun.jna.Callback; interface IExternLibCallback extends Callback {..} 这是我为dll中的callback编写的代码: //Interface to stdcall (Windows) package test1; import com.sun.jna.win32.StdCallLibrary; interface IExternLibCallback extends StdCallLibrary.StdCallCallback { void callback (JEventDataStructure context_data); } //Class that implements the interface package test1; class ExternLibCallback implements IExternLibCallback { … Other class codes go here …. @ Override […]

JNA:枚举系统处理内存错误-1073740940(0xC0000374)

我想枚举Windows 64位的所有系统句柄与以下内容: WinDef.ULONGByReference nBufferLength = new WinDef.ULONGByReference(); Memory pInfo = new Memory(4); long ntStatus = -1; while (ntStatus != 0 /* NT_SUCCESS */) { ntStatus = NtDll.INSTANCE.NtQuerySystemInformation( 0x10, pInfo, (int) pInfo.size(), nBufferLength); if (ntStatus == 0xC0000004 /*STATUS_INFO_LENGTH_MISMATCH*/) { if (pInfo != Pointer.NULL) { Native.free(Pointer.nativeValue(pInfo)); } int bufferLength = nBufferLength.getValue().intValue(); pInfo = new Memory(bufferLength); } else […]

JNA:com.sun.jna.platform.win32.Win32Exception – 访问被拒绝

我使用下面的代码来控制从Java程序的Windows服务 public class PostgresService2 { public static void main(String[] args) { try { W32ServiceManager serviceManager = new W32ServiceManager(); serviceManager.open(Winsvc.SERVICE_STOP); W32Service service = serviceManager.openService("DBService", Winsvc.SERVICE_ACCEPT_STOP); service.stopService(); service.close(); } catch (Exception ex) { ex.printStackTrace(); } } } 这给Windows7(64位)机器上的错误 com.sun.jna.platform.win32.Win32Exception: Access is denied. at com.sun.jna.platform.win32.W32Service.queryStatus(W32Service.java at com.sun.jna.platform.win32.W32Service.waitForNonPendingState(W32S at com.sun.jna.platform.win32.W32Service.stopService(W32Service.java at chs.capitalmigrate.ui.PostgresService2.main(PostgresService2.java 运行该命令的shell具有pipe理权限。 我如何提供完整的访问?

在项目中包含JNA代码 – 编译错误

我正在从另一个StackOverflow后的示例代码 – Java – 如何快速截图 ,但我有一些问题。 我从其Github仓库下载了JNA文件,然后将该文件复制到JAR文件中,并将其放入我的程序所在的同一文件夹中。 但是,当我尝试编译我的程序,它给了我很多错误,如下所示: C:\Users\windows\Desktop\testPrintScreen>javac JNAScreenShot.java JNAScreenShot.java:12: error: package com.sun.jna.platform.win32 does not exist import com.sun.jna.platform.win32.W32API; ^ JNAScreenShot.java:129: error: package com.sun.jna.platform.win32 does not exist interface GDI32 extends com.sun.jna.platform.win32.GDI32 { ^ JNAScreenShot.java:58: error: cannot find symbol bufferedImageFromBitmap(GDI32.HDC blitDC, ^ symbol: class HDC location: interface GDI32 JNAScreenShot.java:59: error: cannot find symbol GDI32.HBITMAP outputBitmap, ^ […]

JNA捕获每个窗口:java.lang.AbstractMethodError

我试图重现尝试捕捉一个窗口如下: Java – Window Image (2岁以后) 我正在使用JNA 3.5.0,并testing了XP下的未修改的代码和7与7,并都失败了相同的跟踪: Exception in thread "main" java.lang.AbstractMethodError: com.sun.jna.Structure.getFieldOrder()Ljava/util/List; at com.sun.jna.Structure.fieldOrder(Structure.java:831) at com.sun.jna.Structure.getFields(Structure.java:857) at com.sun.jna.Structure.deriveLayout(Structure.java:983) at com.sun.jna.Structure.calculateSize(Structure.java:908) at com.sun.jna.Structure.calculateSize(Structure.java:896) at com.sun.jna.Structure.allocateMemory(Structure.java:357) at com.sun.jna.Structure.<init>(Structure.java:191) at com.sun.jna.Structure.<init>(Structure.java:180) at com.sun.jna.Structure.<init>(Structure.java:167) at com.sun.jna.Structure.<init>(Structure.java:159) at com.sun.jna.platform.win32.WinDef$RECT.<init>(WinDef.java:320) at Paint.capture(Paint.java:24) at Paint.<init>(Paint.java:71) at Paint.main(Paint.java:64) 重现它只是运行: import com.sun.jna.platform.win32.WinDef.RECT; public class Test { public static void main(String[] args) { […]