java - 减少/缩小使用 JNA 的 Java 项目的 JAR 大小?

标签 java jna

我正在使用 JNA 隐藏一个特定的窗口,它工作正常,但我需要缩小我的整个项目。我想 JNA 中有很多我不需要的东西。 有没有一种方法/工具可以以编程方式删除所有在以下主要方法的情况下从未调用过的东西?我的项目中包含所有 JNA 类,而不仅仅是普通的 jar 文件。

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.platform.win32.WinUser.WNDENUMPROC;
import com.sun.jna.win32.StdCallLibrary;

public class HideHwnd {
   public interface User32 extends StdCallLibrary {
      User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
      boolean EnumWindows(WinUser.WNDENUMPROC lpEnumFunc, Pointer arg);
      int GetWindowTextA(HWND hWnd, byte[] lpString, int nMaxCount);
      boolean ShowWindow(HWND hWnd, int i);
   }

   public static void main(String[] args) {
      final User32 user32 = User32.INSTANCE;
      user32.EnumWindows(new WNDENUMPROC() {
         public boolean callback(HWND hWnd, Pointer arg1) {
            byte[] windowText = new byte[512];
            user32.GetWindowTextA(hWnd, windowText, 512);
            String wText = Native.toString(windowText);

            if (wText.isEmpty()) {
               return true;
            }
            if (wText.startsWith("window1")){
                if (user32.ShowWindow(hWnd, 1))
                    System.out.println(wText+" is hidden now!");
            }
            return true;
         }
      }, null);
   }
}

提前致谢,汤姆

最佳答案

我在 ProGuard 上取得了巨大的成功,尽管我还没有在任何 JNA 项目中尝试过:

ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or for Java Micro Edition.

可以完全禁用混淆,ProGuard 将扫描类文件依赖关系并忽略未使用的类(可以指定“始终保留的类”)。 ProGuard 也可以用于外部库,并用于构建仅包含“所需类”的单个 JAR。

关于java - 减少/缩小使用 JNA 的 Java 项目的 JAR 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10273002/

相关文章:

java - JNA:释放 native 内存后存储 Java String 的副本

java - 使用 StdCallFunctionMapper 在 JNA 中重命名 DLL 函数

java - JNA 直接调用不适用于参数结构[]

java - 以最小的努力从 Java 代码使用 Windows 静态库(最好使用 JNA)

java - OS-X 上的 VTK Java、Cocoa 异常

java - 我可以在同一个服务中使用两个存储库吗?

java - R 文件从 Android Studio 中删除

java - 使用 Java 在 Windows 中设置壁纸

java - 为什么 Java 不允许 Throwable 的泛型子类?

java - Java 运算符总是从左到右阅读吗?