Articles of JNA

在本地库中查找暴露的方法来访问JNA / JNI?

嗨:我想用JNA来访问本地库中的一些函数。 1)我如何反思本机库文件(例如.so文件),看看有什么方法可用? 2)在.so文件中可访问的方法和为编译这些文件而构build的C代码之间是否存在一对一映射? 3)JNA是否可以在所有只有java / native互操作涉及从Java调用本机库的情况下工作(我认为这是JNA的经典用例),还是有时需要JNI?

从Java调用Windows内核函数最简单的方法是什么?

在寻找如何做到这一点的时候,我发现了一些关于不同选项的模糊讨论,比如JNI和JNA,但是没有太多具体的例子。 上下文:如果Java的File.renameTo()不能完成它的工作(无论什么原因; 有点问题 ),我想退回到直接使用这个在kernel32.dll中定义的本地Windows函数( 从此答案 ): BOOL WINAPI MoveFile( __in LPCTSTR lpExistingFileName, __in LPCTSTR lpNewFileName ); 所以,使用任何方法,你将如何从Java代码中调用该函数? 我正在寻找最简单的方法,使用最less量的非Java代码或额外的步骤(例如编译或部署)。

如何使用Java Native Access为Java.exe以外的进程设置进程关联?

虽然手动操作相当容易,但是我试图在Windows 7中为各种虚拟机初始创build时间自动设置cpu亲和性。 该项目是在Java中,我试图避免直接包括C代码,所以我一直在使用Java Native Access,它掩盖像winapi的东西。 我是图书馆的新手,虽然有一些基本的快速Googlesearchfunction,但还是缺乏教程或示例。 使用下面的代码,我可以设置主要Java进程的亲和性(本地的ffffffffffffffff),但其他进程仍然完全不受影响,即使我有权限使用任务pipe理器手动设置亲和力。 我也重复了从0到10000的所有整数,而不是input我知道有效的ID。 主要课程: import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.WinNT.HANDLE; public class SetAffinity { public static void main(String[] args){ int pid = -1; AffinityKernel instance = (AffinityKernel)Native.loadLibrary("Kernel32",AffinityKernel.class)); System.out.println(instance.SetProcessAffinityMask(new HANDLE(new Pointer(pid)), 1)); } } 工具界面: import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinNT.HANDLE; public interface AffinityKernel extends Kernel32{ public boolean SetProcessAffinityMask(HANDLE hProcess, int dwProcessAffinityMask); } […]

为什么我得到java.lang.UnsatisfiedLinkError:无法加载库?

我正尝试使用JNA从我的Java应用程序中调用.dll文件。 我收到以下exception: 线程“main”中的exceptionjava.lang.UnsatisfiedLinkError:无法加载库“C:\ Windows \ System32 \ foo.dll”:无法find指定的模块。 .dll和我的JDK都是32位(OS_ARCH =“i586”),虽然我在64位Windows 7 PC上运行它。 .dll位于System32文件夹中。 我正在使用Eclipse,并将System32文件夹添加到Java Build Path Properties中的Libraries选项卡下的JRE System库中的Native库位置(尽pipe我不认为这是必须的)。 我将不胜感激任何帮助或build议。 谢谢, -Munk。

如何获得Java中的所有窗口句柄的列表(使用JNA)?

我是JNA的新手。 我正试图得到包括最小化的所有窗口句柄。 我需要所有窗口的HWND 。 我经历了Windows的问题:如何获得所有可见窗口的列表? 这帮助我得到了Windows的列表,但它有hWndtypes为int。 我不能用com.sun.jna.platform.win32.User32函数来请求com.sun.jna.platform.win32.WinDef.HWNDtypes的hWnd 。 所以,有没有办法得到所有types的com.sun.jna.platform.win32.WinDef.HWND而不是int指针的窗口句柄? 最后,为什么int和HWND的区别? 它如何接受? 我有点困惑。 谢谢。 我有下面的代码(从Hovercreft的答案编辑): import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.platform.win32.WinDef.RECT; import com.sun.jna.platform.win32.WinUser.WNDENUMPROC; public class TryWithHWND { public static void main(String[] args) { final User32 user32 = User32.INSTANCE; user32.EnumWindows(new WNDENUMPROC() { int count = 0; public boolean callback(HWND hWnd, Pointer arg1) { […]

JNA简单的函数调用在Linux(x64)上工作,但不能在windows(x86)上工作

我想从Java运行下面的C函数使用JNA,但我得到一个错误(无效的内存访问)在x86窗口(DLL),但不是在x64 Linux(.SO)。 cfunction char* testcopy(char* out,char* in) { strcpy(out,in); free(in); return out; }; Ctesting:在两个平台(Eclipse CDT / MVC ++) 当通过linux共享库或者windows dll暴露函数并直接在C中调用的时候,结果是OK的。 … char out[10]; char* res; char* in = (char*)malloc(3*sizeof(char)); strcpy(in,"ab"); res = testcopy(out,in); fprintf(stdout,"out: %s\n",out); fprintf(stdout,"res: %s\n",res); return 0; 或者使用DLL: … HINSTANCE hInst = LoadLibrary(_T("C:\\jnatest.dll")); if( hInst != NULL ) { typedef char* (*maFonction)(char*, char*); […]

使用JNA来获取GetForegroundWindow();

我在前一个线程上提出了一个类似的问题( https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus),但我被引导使用JNI,而我没有太多的成功…我已经阅读了一些教程,虽然有些工作正常,但其他人不能得到我需要的信息,这是前台窗口的标题。 现在我正在研究JNA,但我不知道如何访问GetForegroundWindow()…我想我可以打印文本,一旦我得到了处理窗口使用此代码(在另一个线程上find): import com.sun.jna.*; import com.sun.jna.win32.*; public class jnatest { public interface User32 extends StdCallLibrary { User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class); int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount); } public static void main(){ byte[] windowText = new byte[512]; PointerType hwnd = //GetForegroundWindow() (?)… User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512); System.out.println(Native.toString(windowText)); } } 有什么build议么? 谢谢!

使用Java在Windows中设置壁纸

我正在尝试使用Java在Windows 7中设置壁纸。 我试过使用这里和这里的答案代码。 它在Windows 8和10中完美工作,但不是在7中。没有错误,它只是没有做任何事情。 我已经尝试设置不同的1920×1080壁纸(这是控制面板中设置的分辨率)和不同的文件格式(PNG,JPG,BMP),并在几个不同的计算机上运行该程序。 我应该设置壁纸的行后的代码运行良好。 我正在使用JNA版本4.2.0和Java 8更新60。 有没有什么办法可以在Windows 7中使用Java设置壁纸? 编辑: 这是我的代码: import java.util.HashMap; import com.sun.jna.Native; import com.sun.jna.platform.win32.WinDef.UINT_PTR; import com.sun.jna.win32.StdCallLibrary; import com.sun.jna.win32.W32APIFunctionMapper; import com.sun.jna.win32.W32APITypeMapper; public class WallpaperChanger { public interface SPI extends StdCallLibrary { long SPI_SETDESKWALLPAPER = 20; long SPIF_UPDATEINIFILE = 0x01; long SPIF_SENDWININICHANGE = 0x02; @SuppressWarnings("serial") SPI INSTANCE = (SPI) Native.loadLibrary("user32", SPI.class, new […]

JNA – 查询Windows进程

我正在尝试使用JNA来返回特定Windows进程的详细信息。 不完全确定如何做到这一点。 无法在互联网上find很多帮助。 我想返回的一些信息包括CPU和内存使用情况。 下面只是我find的一个例子。 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import com.sun.jna.*; import com.sun.jna.Library.Handler; import com.sun.jna.platform.win32.*; import com.sun.jna.platform.win32.Advapi32Util.*; import com.sun.jna.platform.win32.WinNT.*; import com.sun.jna.ptr.IntByReference; import com.sun.jna.win32.*; import com.sun.jna.Native; import com.sun.jna.platform.win32.*; import com.sun.jna.win32.W32APIOptions; public class WindowsProcess { public static void main(String[] args) { WinNT winNT = (WinNT) Native.loadLibrary(WinNT.class, W32APIOptions.UNICODE_OPTIONS); […]

Windows上的Java:如何删除垃圾文件(使用JNA)

我根本没有使用Windows API的经验,所以请原谅我的无知。 我想删除垃圾文件。 如何使用JNA做到这一点,以及如何检测这是不可能的,例如,因为文件位于networking共享?