2017-09-05 157 views
2

我正在嘗試在Android設備上爲UI性能測試設置FPSMeter應用程序。 They say我需要安裝應用程序的移動和桌面部分。移動部分沒有問題,但桌面部分的.jar文件未啓動。 我試着通過命令行啓動它,這就是它返回:.jar文件不會運行(InvocationTargetException)

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(64位)下管理員角色

環境變量設置正確。

我該怎麼做才能真正啓動它?

+0

什麼是Java程序? – HyperNeutrino

+0

你是什麼意思? – obi4niy

+0

喜歡,你試圖運行的程序是什麼? – HyperNeutrino

回答

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) 

...它看起來像有一個NPE某種adb包裝的初始化期間回事(更準確地說,是的adb提取過程中捆綁在jar文件中)。

這幾乎所有你可以從棧跟蹤中推斷出來,所以我下載了jar,試圖運行它,並得到完全相同的錯誤(在Windows 8.1,jre7(32bit),jre8(32和64bit))上重現。

我很好奇,並決定用調試器\反編譯器戳它。

儘管很難確定爲什麼application.ADB行爲不當(由於它是如何編譯的具體情況),我有一個快速和骯髒的技巧,你可以用來避免這個問題的想法。也就是說,原始application.ADB可以替換爲虛擬存根,您可以手動解包adb

以下是如何做到這一點。

  1. 解壓縮文件adb.exeAdbWinApi.dll,位於AdbWinUsbApi.dllwindows文件夾內FPSMeterApp.jar
  2. 把它們放在同一目錄FPSMeterApp.jar
  3. 編譯下面的stub類(javac ADB.java):
 
package application; 

public class ADB 
{ 
    private String ADB_LOCATION = "adb.exe"; 

    ADB() { 
    } 

    public String getPath() { 
    return this.ADB_LOCATION; 
    } 
} 
  1. 替換application/ADB.classFPSMeterApp.jarADB.class存根你只是compilled
  2. 你現在可以運行java -jar FPSMeterApp.jar

這些步驟工作對我來說,我已經能夠無例外地運行罐子,看到在UI連接Android設備。