减少/缩小使用JNA的Java Project的JAR大小?

时间:2012-04-22 23:15:11

标签: 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);
   }
}

先谢谢,汤姆

2 个答案:

答案 0 :(得分:4)

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

  

ProGuard是一个免费的Java 类文件收缩器,优化器,混淆器和预验证器。它检测并删除未使用的类,字段,方法和属性。它优化字节码并删除未使用的指令。它使用简短的无意义名称重命名剩余的类,字段和方法。最后,它预先验证了Java 6或Java Micro Edition的已处理代码。

可以完全禁用混淆,ProGuard将扫描类文件依赖项并省略未使用的类(可以指定“始终保持的类”)。 ProGuard 也可以用于外部库,并用于构建只有“必需类”的单个JAR。

答案 1 :(得分:1)

对于您不打算支持的平台,您还可以安全地删除jna.jar中的任何本机libjnidispatch.so/.dll。