2

我已经用 Java 为 Mac OSx 和 Windows 编写了一个应用程序,但我是在 Windows 上开发的。因此,我使用java.lang.reflect.*为了实现“关于”和“退出”处理程序而不接收异常。

我已将其导出为可执行 Jar,并且在两个操作系统上一切正常。但是,我想混淆应用程序,我正在使用 ProGaurd 来做到这一点。我已经指定了它在 Windows 上工作所需的库(rt.jar、jsse.jar、jce.jar),它在 Windows 上仍然可以正常工作,但是 ProGaurd 告诉我有两个未解析的对类的动态引用或接口,并且混淆的应用程序不再在 Mac 上正常工作(关于和退出处理程序不起作用)。

我在某处读到这ui.jar是必需的,所以我从我的 Mac 上复制了它并在 ProGaurd 中指定了它,但这似乎并没有解决问题!任何解决方案都表示赞赏......

提前致谢

更新

我现在使用 AppleJavaExtensions 来实现使用com.apple.eawt.Application而不是反射的处理程序。但是,我仍然遇到完全相同的问题!这是我目前正在使用的代码:

package ap;
import com.apple.eawt.AboutHandler;
import com.apple.eawt.AppEvent;
import com.apple.eawt.AppEvent.QuitEvent;
import com.apple.eawt.Application;
import com.apple.eawt.QuitHandler;
import com.apple.eawt.QuitResponse;
import com.gui.Tabs;

public class xa implements AboutHandler, QuitHandler {

    // Constructor to register/install the necessary handler's
    public xa(){
        Application.getApplication().setAboutHandler(this);
        Application.getApplication().setQuitHandler(this);
    }

    // Implemented method to catch the About menu item
    @Override
    public void handleAbout(AppEvent.AboutEvent e) {
        Tabs.switchAbout();

    }

    // Implemented method to catch the Quit menu item
    @Override
    public void handleQuitRequestWith(QuitEvent arg0, QuitResponse arg1) {
        Tabs.quit();        
    }
}

而且我正在使用 ProGuard GUI 来混淆我的应用程序。在底部的 Obsfucation 'tab' 中,我添加了 classap.xa并指定它 extends/implements AboutHandler, QuitHandler。我还添加了类com.gui.Tabs,但问题仍然存在。

4

4 回答 4

1

也许你可以试试Apple Java Extensions

使用 Apple Java Extensions,您可以在不使用类的情况下在 Windows 上进行开发java.lang.reflect.*,而且 ProGuard 可能会更容易。

于 2012-06-05T12:01:29.523 回答
0

如果您告诉 ProGuard 不要混淆实现 About 和 Quit 处理程序的类,会有所帮助吗?

于 2012-06-07T11:38:22.043 回答
0

试试这个-dontoptimize选项。某些方法在“无效”时会被删除。并在 Windows 上执行 ProGuard ... for Mac。或者一个愚蠢的选择:尝试在 Mac 上进行混淆并提供两个版本。

于 2012-06-09T11:45:48.267 回答
0

哎呀,我已经解决了这个问题......我只是犯了一个愚蠢的错误

因为我使用的是 ProGuard GUI,所以我没有在添加屏幕中看到“类成员”部分。因此,虽然 ProGuard 没有混淆类本身,但它混淆了方法,因此侦听器无法正常工作。所以,我最终“保留”ap.xa了它的所有方法(包含实际侦听器的类)和com.apple.**(JavaAppleExtensions 包)

然而,还有一件事正在发生。当我从终端运行混淆的 JAR 文件时,我收到以下输出:

Andrews-MacBook-Pro:~ Andy$ java -jar /Users/Andy/Desktop/YLIT\ Final\ 2.jar
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextGetCTM: invalid context 0x0
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextSetBaseCTM: invalid context 0x0
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextGetCTM: invalid context 0x0
Jun  9 20:50:29 Andrews-MacBook-Pro.local java[959] <Error>: CGContextSetBaseCTM: invalid context 0x0
于 2012-06-09T20:06:34.700 回答