【发布时间】:2017-07-05 12:55:13
【问题描述】:
我的目标是使用 JNI 从 kernel32.dll 访问函数。正如你在下面看到的,我做得很糟糕。我在答案中写下了整个过程。
Kernel32.java:
package tn.kernel;
public final class Kernel32 {
public static boolean loadKernel32(){
System.loadLibrary("kernel32");
return true;
}
public static native boolean K32EnumProcesses(int[] pProcessIds, int cb, int[] pBytesReturned);
}
MainClass.java:
package tn.kernel;
public class MainClass {
public static void main(String[] args) {
System.out.println("Program started.");
if(Kernel32.loadKernel32())
System.out.println("Kernel32.dll loaded.");
int n = 2000;
int[] procs = new int[n];
int ls = Integer.SIZE;
int[] rs = new int[1];
if(Kernel32.K32EnumProcesses(procs, ls * n, rs)){
System.out.println("Success");
}
System.out.println("Done.");
}
}
输出:
Program started.
Kernel32.dll loaded.
Exception in thread "main" java.lang.UnsatisfiedLinkError: tn.kernel.Kernel32.K32EnumProcesses([II[I)Z
at tn.kernel.Kernel32.K32EnumProcesses(Native Method)
at tn.kernel.MainClass.main(MainClass.java:15)
这是 EnumProcesses 的语法:
BOOL WINAPI EnumProcesses(
_Out_ DWORD *pProcessIds,
_In_ DWORD cb,
_Out_ DWORD *pBytesReturned
);
如果 PSAPI_VERSION 为 2 或更大,则此函数在 Psapi.h 中定义为 K32EnumProcesses,并在 Kernel32.lib 和 Kernel32.dll 中导出。如果 PSAPI_VERSION 为 1,则此函数在 Psapi.h 中定义为 EnumProcesses,并在 Psapi.lib 和 Psapi.dll 中作为调用 K32EnumProcesses 的包装器导出。来源:msnd.microsoft.com
我尝试了 K32EnumProcesses 和 EnumProcesses。结果相同。
【问题讨论】:
-
你有没有让 loadKernel32 返回 true?
-
@efekctive 是的,它确实返回了 true。你可以看到它写着“加载了Kernel32.dll”。在输出中
-
是的。对不起。您是否厌倦了以详细模式运行 jvm 以查看是否有任何有意义的消息?
标签: java eclipse visual-studio dll java-native-interface