代码之家  ›  专栏  ›  技术社区  ›  Jire

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

  •  0
  • Jire  · 技术社区  · 9 年前

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

    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));
        }
    
    }
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   gpmcadam    9 年前

    A. FromNativeContext 对象是在JNA必须将原始值转换为Java对象时创建的。

    避免使用非基本类型。当您使用从 NativeMapped (即。 HANDLE ,这是一个 PointerType DWORD ,这是一个 IntegerType )从Java对象转换为原始整数或指针会产生额外的开销。

    使用 int 而不是 双字 和使用 Pointer 而不是 手柄 .

    您可能还在 boolean 参数(在 W32APIOptions.DEFAULT_OPTIONS ). 只需使用 整数 或者省略类型映射器(JNA应该能够在没有显式类型映射器的情况下将“int”返回值转换为Java布尔值)。

    您还应该使用 指针 作为参数类型而不是 Memory ,但这主要是关于风格。