我正在尝试在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)正确设置了环境变量。
我应该怎么做才能真正推出它?
答案 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
。
以下是如何做到的。
adb.exe
AdbWinApi.dll
文件夹内的文件AdbWinUsbApi.dll
,windows
,FPSMeterApp.jar
FPSMeterApp.jar
javac ADB.java
):package application; public class ADB { private String ADB_LOCATION = "adb.exe"; ADB() { } public String getPath() { return this.ADB_LOCATION; } }
application/ADB.class
内的FPSMeterApp.jar
替换为刚填好的ADB.class
存根java -jar FPSMeterApp.jar
这些步骤对我有用,我已经能够无异常地运行jar,并在UI中看到连接的Android设备。