なんらかの理由で、 adb による Android ランタイム (ART) でDacapo Benchmarkを実行したいと考えています。実行する手順は次のとおりです。
# convert all .class bytecode in dacapo.jar to .dex bytecode
java -jar dx.jar --dex --output=classes.dex $(find . -name "*.class")
adb push classes.dex /sdcard/dacapo
# run the 'fop' benchmark
adb shell app_process -Djava.class.path=/sdcard/dacapo/classes.dex /sdcard/dacapo Harness fop
ただし、例外情報を取得します。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.net.URL.getProtocol()' on a null object reference
at org.dacapo.harness.CommandLineArgs.extractBenchmarkSet(Unknown Source:52)
at org.dacapo.harness.CommandLineArgs.<init>(Unknown Source:600)
at org.dacapo.harness.TestHarness.main(Unknown Source:64)
at java.lang.reflect.Method.invoke(Native Method)
at Harness.main(Unknown Source:91)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:399)
Dacapo のソース コードを確認すると、例外のソースが見つかりました。
public class CommandLineArgs{
static List<String> extractBenchmarkSet() throws IOException {
List<String> benchmarks = new ArrayList<String>();
URL url = CommandLineArgs.class.getClassLoader().getResource("cnf");
String protocol = url.getProtocol();
...
}
}
ご覧のとおり、参照をgetResource("cnf")
返しnull
ます。その理由は、dacapo.jar にいくつかのリソースがあるためですが、dx.jar
リソース ファイルなしで .class を .dex にしか変換できません。
cnf
また、リソースを/sdcard/
andに配置しようとしました/sdcard/dacapo
が、それでも失敗します。
では、.dex バイトコードがcnf
リソースにアクセスできるようにするにはどうすればよいでしょうか?