.jar文件不会运行(InvocationTargetException)

时间:2017-09-05 15:01:10

标签: java

我正在尝试在Android设备上设置FPSMeter应用以进行UI性能测试。 They say我需要安装应用的移动和桌面部分。移动部件没有问题,但桌面部件的.jar文件无法启动。 我尝试通过命令行启动它,以及它返回的内容:

java -jar FPSMeterApp.jar
os windows
Exception in Application start method
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Lau
ncherImpl.java:389)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImp
l.java:323)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherIm
pl.java:917)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(
LauncherImpl.java:182)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
        at application.Unpack.extract(Unknown Source)
        at application.Unpack.getFile(Unknown Source)
        at application.Unpack.file(Unknown Source)
        at application.ADB.<init>(Unknown Source)
        at application.Main.start(Unknown Source)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162
(LauncherImpl.java:863)
        at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(Platfor
mImpl.java:326)
        at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.
java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformI
mpl.java:294)
        at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatch
er.java:95)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.ja
va:191)
        ... 1 more
Exception running application application.Main

我安装了x86和x64最新版本的Java RTE,我也尝试单独安装它们 - 没有任何帮助。

我在管理员角色

下使用Windows 7(x64)

正确设置了环境变量。

我应该怎么做才能真正推出它?

1 个答案:

答案 0 :(得分:3)

好的,这是一种奇怪的解决方案(粗略的黑客肯定),但可以帮助您解决问题。

首先,从你的堆栈跟踪:

Caused by: java.lang.NullPointerException
        at application.Unpack.extract(Unknown Source)
        at application.Unpack.getFile(Unknown Source)
        at application.Unpack.file(Unknown Source)
        at application.ADB.<init>(Unknown Source)

...看起来在某种adb包装器的初始化过程中会出现NPE(更确切地说,在提取jar文件中捆绑的adb期间)。

这几乎是你可以从堆栈跟踪中推断出的,所以我下载了jar,尝试运行它并得到完全相同的错误(在Windows 8.1,jre7(32位),jre8(32和64位)上可重现)。 / p>

我很好奇,决定用调试器\反编译器来解决它。

虽然很难找出application.ADB行为不当的确切原因(由于编译方式的细节),但我已经了解了可以用来避免问题的快速和肮脏的技巧。也就是说,原始application.ADB可以用虚拟存根替换,您可以手动解包adb

以下是如何做到的。

  1. 解压缩位于adb.exe
  2. 内的AdbWinApi.dll文件夹内的文件AdbWinUsbApi.dllwindowsFPSMeterApp.jar
  3. 将它们放在与FPSMeterApp.jar
  4. 相同的目录中
  5. 编译以下存根类(javac ADB.java):
  6. package application;
    
    public class ADB
    {
      private String ADB_LOCATION = "adb.exe";
    
      ADB() {
      }
    
      public String getPath() {
        return this.ADB_LOCATION;
      }
    }
    
    1. application/ADB.class内的FPSMeterApp.jar替换为刚填好的ADB.class存根
    2. 您现在可以运行java -jar FPSMeterApp.jar
    3. 这些步骤对我有用,我已经能够无异常地运行jar,并在UI中看到连接的Android设备。