JNA 何时创建 FromNativeContext? (成吨的垃圾)

When does JNA create FromNativeContext? (Tons of garbage)

JNA 何时创建 FromNativeContext 以及如何防止创建这些对象?我用我的应用程序在几秒钟内创造了数百万美元。我正在使用这个直接映射 class:

public final class Kernel32Direct {

    public static native boolean WriteProcessMemory(Pointer process, long address, Memory memory, int size, int written);

    public static native boolean ReadProcessMemory(Pointer process, long address, Memory memory, int size, int written);

    public static native Pointer OpenProcess(int desired, boolean inherit, int pid);

    public static native WinNT.HANDLE CreateToolhelp32Snapshot(WinDef.DWORD var1, WinDef.DWORD var2);

    public static native boolean Process32Next(WinNT.HANDLE var1, Tlhelp32.PROCESSENTRY32 var2);

    public static native boolean CloseHandle(WinNT.HANDLE var1);

    static {
        Native.register(NativeLibrary.getInstance("Kernel32", W32APIOptions.UNICODE_OPTIONS));
    }

}

当 JNA 必须将原始值转换为 Java 对象时,会创建一个 FromNativeContext 对象。

避免使用非原始类型。当您使用派生自 NativeMapped 的类型(即 HANDLE,即 PointerTypeDWORD,即 IntegerType)时,您会招致从 Java 对象转换为原始整数或指针的额外开销。

使用 int 而不是 DWORD,并使用 Pointer 而不是 HANDLE

您可能还会对 boolean 参数(在 W32APIOptions.DEFAULT_OPTIONS 中定义)进行一些类型转换。只需使用 int 代替布尔值输入,或者省略类型映射器(JNA 应该能够将 "int" return 值转换为 Java 布尔值而无需显式类型映射器)。

您还应该使用 Pointer 作为参数类型而不是 Memory,但这主要与样式有关。