crimsonwoods / javassist-android

Javassit for Android
214 stars 42 forks source link

javassist-android-master;makeClass() method throw EOFException #2

Open blstbbcxz opened 9 years ago

blstbbcxz commented 9 years ago

Hi @crimsonwoods i'm using javassist-android-master for my project,but when i use "makeClass(inputstream classfile) " (the .class file is in SDCard), javassist throw a EOFException:

java.io.EOFException at libcore.io.Streams.readFully(Streams.java:83) at java.io.DataInputStream.readInt(DataInputStream.java:124) at javassist.bytecode.ClassFile.read(ClassFile.java:767) at javassist.bytecode.ClassFile.(ClassFile.java:114) at javassist.CtClassType.(CtClassType.java:94) at javassist.ClassPool.makeClass(ClassPool.java:748) at javassist.ClassPool.makeClass(ClassPool.java:726) at org.jamruby.javassistsample.MainActivity.onCreate(MainActivity.java:66) at android.app.Activity.performCreate(Activity.java:5104) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2354) at android.app.ActivityThread.access$600(ActivityThread.java:150) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5191) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) at dalvik.system.NativeStart.main(Native Method)

how to fix it? thx!

crimsonwoods commented 9 years ago

I don't know why. But I think, EOFException means that the class file is empty or has contents less than 4byte, maybe.

blstbbcxz commented 9 years ago

@crimsonwoods The .class file i used is javassist-android' sample created, i have decompiled and it has contents(more than 4 bytes).

Now i change the way to create the .class file. I make it by code like the sample.but another issue occured:i create an activity(TestActivity) .class file in SDCard,and declared it in AndroidManifest.xml file.everything runs ok but when MainActivity jump to the dynamic created "TestActivity",it throws ClassNotFoundException, i'm sure that the path in AndroidManifest.xml declaration of TestActivity is the same with dynamic created TestActivity's package item.

Here is the log: 03-16 14:13:46.582: W/Settings(27311): Setting android_id has moved from android.provider.Settings.System to android.provider.Settings.Secure, returning read-only value. 03-16 14:13:48.327: W/System.err(27311): java.lang.ClassNotFoundException: com.pwrd.onesdk.demo.one360.wxapi.WXEntryActivity 03-16 14:13:48.327: W/System.err(27311): at java.lang.Class.classForName(Native Method) 03-16 14:13:48.327: W/System.err(27311): at java.lang.Class.forName(Class.java:217) 03-16 14:13:48.327: W/System.err(27311): at java.lang.Class.forName(Class.java:172) 03-16 14:13:48.327: W/System.err(27311): at com.qihoo.gamecenter.sdk.support.share3rd.h.b(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at com.qihoo.gamecenter.sdk.support.share3rd.h.a(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at com.qihoo.gamecenter.sdk.support.share3rd.a.c.g(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at com.qihoo.gamecenter.sdk.support.share3rd.e.a(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at com.qihoo.gamecenter.sdk.support.share3rd.e.run(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at com.qihoo.gamecenter.sdk.social.plugin.b.startOutSDK(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at com.qihoo.gamecenter.sdk.activity.ContainerActivity.onCreate(Unknown Source) 03-16 14:13:48.332: W/System.err(27311): at android.app.Activity.performCreate(Activity.java:5104) 03-16 14:13:48.337: W/System.err(27311): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 03-16 14:13:48.337: W/System.err(27311): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) 03-16 14:13:48.337: W/System.err(27311): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2354) 03-16 14:13:48.337: W/System.err(27311): at android.app.ActivityThread.access$600(ActivityThread.java:150) 03-16 14:13:48.337: W/System.err(27311): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244) 03-16 14:13:48.337: W/System.err(27311): at android.os.Handler.dispatchMessage(Handler.java:99) 03-16 14:13:48.337: W/System.err(27311): at android.os.Looper.loop(Looper.java:137) 03-16 14:13:48.342: W/System.err(27311): at android.app.ActivityThread.main(ActivityThread.java:5191) 03-16 14:13:48.342: W/System.err(27311): at java.lang.reflect.Method.invokeNative(Native Method) 03-16 14:13:48.342: W/System.err(27311): at java.lang.reflect.Method.invoke(Method.java:511) 03-16 14:13:48.342: W/System.err(27311): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 03-16 14:13:48.342: W/System.err(27311): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 03-16 14:13:48.342: W/System.err(27311): at dalvik.system.NativeStart.main(Native Method) 03-16 14:13:48.342: W/System.err(27311): Caused by: java.lang.NoClassDefFoundError: com/pwrd/onesdk/demo/one360/wxapi/WXEntryActivity 03-16 14:13:48.342: W/System.err(27311): ... 24 more 03-16 14:13:48.342: W/System.err(27311): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pwrd.onesdk.demo.one360.wxapi.WXEntryActivity" on path: /data/app/com.pwrd.onesdk.demo.one360-1.apk 03-16 14:13:48.342: W/System.err(27311): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65) 03-16 14:13:48.342: W/System.err(27311): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 03-16 14:13:48.342: W/System.err(27311): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 03-16 14:13:48.342: W/System.err(27311): ... 24 more

So, i dont know whether i can through this way to dynamic create an "Activity" .class file in SDCard, let the dalvik load it and use it as the others "normal Activity". Thx!

crimsonwoods commented 9 years ago

I'm not a debugger for you. You must debug it on yourself.

blstbbcxz commented 9 years ago

@crimsonwoods okay thank you, and this question? "So, i dont know whether i can through this way to dynamic create an 'Activity' .class file in SDCard, let the dalvik load it and use it as the others 'normal Activity'. Thx!"

crimsonwoods commented 9 years ago

Currently, we cannot launch a Activity generated dynamically. Because PathClassLoader (default ClassLoader created by JVM) cannot know existence of the Activity. But, you might be able to realize that behavior if you used Thread.setContextClassLoader method.