Использование Janino В Android и эта ошибка выскочила... Есть идеи, как это исправить?

Вот код, который вызывает проблему. Код здесь использует janino для создания компилятора. Я предполагаю, что ошибка в основном связана с оператором String внизу поста Java.lang.ClassnotFound

  //---------------------------------------------------------
    CompilerFactory compilerFactory = new CompilerFactory();
    ISimpleCompiler SimpI = compilerFactory.newSimpleCompiler();
    SimpI.cook("public class test{"
            + "public static int main(String[] args){"
            + "System.out.println(\"test\");"
            + "return 2 + 2;"
            + "}"
            + "}");
06-16 17:31:55.308    5243-5243/mandj.appbuildin.codingcoach.innovo D/AndroidRuntime﹕ Shutting down VM
06-16 17:31:55.308    5243-5243/mandj.appbuildin.codingcoach.innovo W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x418afc08)
06-16 17:31:55.323    5243-5243/mandj.appbuildin.codingcoach.innovo E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: mandj.appbuildin.codingcoach.innovo, PID: 5243
    java.lang.IllegalStateException: Could not execute method of the activity
            at android.view.View$1.onClick(View.java:3969)
            at android.view.View.performClick(View.java:4640)
            at android.view.View$PerformClick.run(View.java:19421)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4640)
            at android.view.View$PerformClick.run(View.java:19421)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: org.codehaus.commons.compiler.CompileException: Line 1, Column 48: String
            at org.codehaus.janino.UnitCompiler.findTypeByName(UnitCompiler.java:6809)
            at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:5255)
            at org.codehaus.janino.UnitCompiler.access$12600(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$16.visitReferenceType(UnitCompiler.java:5101)
            at org.codehaus.janino.Java$ReferenceType.accept(Java.java:2884)
            at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:5141)
            at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:5367)
            at org.codehaus.janino.UnitCompiler.access$12400(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$16.visitArrayType(UnitCompiler.java:5099)
            at org.codehaus.janino.Java$ArrayType.accept(Java.java:2958)
            at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:5141)
            at org.codehaus.janino.UnitCompiler.access$16700(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$31.getParameterTypes(UnitCompiler.java:8449)
            at org.codehaus.janino.IClass$IMethod.getDescriptor(IClass.java:1025)
            at org.codehaus.janino.IClass.getIMethods(IClass.java:211)
            at org.codehaus.janino.IClass.getIMethods(IClass.java:199)
            at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:405)
            at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:389)
            at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:343)
            at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1136)
            at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:350)
            at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:318)
            at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:346)
            at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:189)
            at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:180)
            at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:78)
            at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:71)
            at mandj.appbuildin.codingcoach.innovo.BooleanLogicOne.onClick(BooleanLogicOne.java:64)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4640)
            at android.view.View$PerformClick.run(View.java:19421)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: String
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at org.codehaus.janino.ClassLoaderIClassLoader.findIClass(ClassLoaderIClassLoader.java:78)
            at org.codehaus.janino.IClassLoader.loadIClass(IClassLoader.java:254)
            at org.codehaus.janino.UnitCompiler.findTypeByName(UnitCompiler.java:6805)
            at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:5255)
            at org.codehaus.janino.UnitCompiler.access$12600(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$16.visitReferenceType(UnitCompiler.java:5101)
            at org.codehaus.janino.Java$ReferenceType.accept(Java.java:2884)
            at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:5141)
            at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:5367)
            at org.codehaus.janino.UnitCompiler.access$12400(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$16.visitArrayType(UnitCompiler.java:5099)
            at org.codehaus.janino.Java$ArrayType.accept(Java.java:2958)
            at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:5141)
            at org.codehaus.janino.UnitCompiler.access$16700(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$31.getParameterTypes(UnitCompiler.java:8449)
            at org.codehaus.janino.IClass$IMethod.getDescriptor(IClass.java:1025)
            at org.codehaus.janino.IClass.getIMethods(IClass.java:211)
            at org.codehaus.janino.IClass.getIMethods(IClass.java:199)
            at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:405)
            at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:389)
            at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:343)
            at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1136)
            at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:350)
            at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:318)
            at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:346)
            at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:189)
            at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:180)
            at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:78)
            at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:71)
            at mandj.appbuildin.codingcoach.innovo.BooleanLogicOne.onClick(BooleanLogicOne.java:64)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4640)
            at android.view.View$PerformClick.run(View.java:19421)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NoClassDefFoundError: String
            at java.lang.Class.classForName(Native Method)
            at java.lang.Class.forName(Class.java:251)
            at org.codehaus.janino.ClassLoaderIClassLoader.findIClass(ClassLoaderIClassLoader.java:78)
            at org.codehaus.janino.IClassLoader.loadIClass(IClassLoader.java:254)
            at org.codehaus.janino.UnitCompiler.findTypeByName(UnitCompiler.java:6805)
            at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:5255)
            at org.codehaus.janino.UnitCompiler.access$12600(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$16.visitReferenceType(UnitCompiler.java:5101)
            at org.codehaus.janino.Java$ReferenceType.accept(Java.java:2884)
            at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:5141)
            at org.codehaus.janino.UnitCompiler.getType2(UnitCompiler.java:5367)
            at org.codehaus.janino.UnitCompiler.access$12400(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$16.visitArrayType(UnitCompiler.java:5099)
            at org.codehaus.janino.Java$ArrayType.accept(Java.java:2958)
            at org.codehaus.janino.UnitCompiler.getType(UnitCompiler.java:5141)
            at org.codehaus.janino.UnitCompiler.access$16700(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$31.getParameterTypes(UnitCompiler.java:8449)
            at org.codehaus.janino.IClass$IMethod.getDescriptor(IClass.java:1025)
            at org.codehaus.janino.IClass.getIMethods(IClass.java:211)
            at org.codehaus.janino.IClass.getIMethods(IClass.java:199)
            at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:405)
            at org.codehaus.janino.UnitCompiler.compile2(UnitCompiler.java:389)
            at org.codehaus.janino.UnitCompiler.access$400(UnitCompiler.java:182)
            at org.codehaus.janino.UnitCompiler$2.visitPackageMemberClassDeclaration(UnitCompiler.java:343)
            at org.codehaus.janino.Java$PackageMemberClassDeclaration.accept(Java.java:1136)
            at org.codehaus.janino.UnitCompiler.compile(UnitCompiler.java:350)
            at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:318)
            at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:346)
            at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:189)
            at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:180)
            at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:78)
            at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:71)
            at mandj.appbuildin.codingcoach.innovo.BooleanLogicOne.onClick(BooleanLogicOne.java:64)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4640)
            at android.view.View$PerformClick.run(View.java:19421)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5476)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
            at dalvik.`enter code here`system.NativeStart.main(Native Method)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "String" on path: DexPathList[[zip file "/data/app/mandj.appbuildin.codingcoach.innovo-79.apk"],nativeLibraryDirectories=[/data/app-lib/mandj.appbuildin.codingcoach.innovo-79, /vendor/lib, /system/lib]]
            at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.

1 ответ

РЕДАКТИРОВАТЬ: я прочитал вашу трассировку стека немного ближе, и в конце говорится, что Далвик не может найти класс String, Вы можете попробовать снабдить ваш SimpleCompiler кодом, который не использует никаких внешних символов, таких как String, например public class Test{ public int doTest(){ return 21+21; }} И посмотрите, если это компилируется и запускается. Если это так, тогда не обращайте внимания на всю приведенную ниже часть и просто работайте над введением классов, которые dalvik ищет в загрузчике классов. Я думаю, что вы можете сделать это, представив родительский загрузчик классов с помощью [SimpleCompiler.setParentClassLoader()][1]

Вся часть ниже

Android использует альтернативный формат байт-кода, особенно это касается JVM dalvik. Когда вы создаете APK, инструменты Android SDK фактически преобразуют выходные байт-коды вашего любимого Java-компилятора в формат, совместимый с dalvik ( dex).

Поэтому, чтобы это исправить, вы ищете способ постобработки вывода janino перед его запуском. Это может быть действительно сложно. Во-первых, как убедить janino выводить файлы.class вместо того, чтобы пытаться загрузить их напрямую? Я действительно прибыл сюда из Google, пытаясь узнать больше об этом.

Во-вторых, как вы можете запустить тот же процесс преобразования, который происходит в вашем Android SDK, когда он конвертируется в формат dex, но на самом устройстве Android?

Я закончу двумя своими лучшими подсказками: UnitCompiler и dex-tools. Удачи!

Другие вопросы по тегам