Android的E /包裹:当解组(仅在三星TAB3)未找到类 [英] Android E/Parcel﹕ Class not found when unmarshalling (only on Samsung Tab3)
问题描述
我一直无法解决为什么这个错误发生,并且只有在三星TAB3设备,运行4.4.2?它发生在我MainActivity启动另一个活动,并传递Parcelable类像这样的意图:
私人无效的DebugTest(TestParcel cfgOptions){
TestParcel cfgOptions =新TestParcel();
cfgOptions.setValue(15); //只是为了验证
意向意图=新的意图(MainActivity.this,TestActivity.class);
intent.putExtra(cfgOptions,cfgOptions);
startActivityForResult(意向,DBG_TEST);
}
TestActivity得到parcelable数据,像这样:
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.test_activity);
TestParcel cfgOptions = getIntent()getExtras()getParcelable(cfgOptions)。。;
}
类TestParcel:
进口android.os.Parcel;
进口android.os.Parcelable;
公共类TestParcel实现Parcelable {
私人长l_ucs_value = 0;
私人字符串s_rx_number =;
//构造
公共TestParcel(){
l_ucs_value = 0;
s_rx_number =;
}
公共无效RxNumber(String s)将{
s_rx_number =秒;
}
公共字符串RxNumber(){
返回s_rx_number;
}
// ------------------------------------------------ -----------------------
公共无效的setValue(长V){
v l_ucs_value =;
}
众长的getValue(){返回l_ucs_value; }
保护TestParcel(包裹中){
l_ucs_value = in.readLong();
s_rx_number = in.readString();
}
@覆盖
公众诠释describeContents(){
返回0;
}
@覆盖
公共无效writeToParcel(包裹DEST,INT标志){
dest.writeLong(l_ucs_value);
dest.writeString(s_rx_number);
}
@燮pressWarnings(未使用)
公共静态最终Parcelable.Creator< TestParcel> CREATOR =新Parcelable.Creator< TestParcel>(){
@覆盖
公共TestParcel createFromParcel(包裹中){
返回新TestParcel(中);
}
@覆盖
公共TestParcel [] newArray(INT尺寸){
返回新TestParcel【尺寸】;
}
};
}
此外,我只看到这个三星TAB3设备上 - 但是这是我们需要它来工作的设备。下面是三星的logcat:
八月二号至18日:05:55.393 2235年至2571年/? E /包裹?解组时找不到类:com.vms.android.VersatileDEX.TestParcel
抛出java.lang.ClassNotFoundException:com.vms.android.VersatileDEX.TestParcel
在java.lang.Class.classForName(本机方法)
在java.lang.Class.forName(Class.java:251)
在java.lang.Class.forName(Class.java:216)
在android.os.Parcel.readParcelableCreator(Parcel.java:2133)
在android.os.Parcel.readParcelable(Parcel.java:2097)
在android.os.Parcel.readValue(Parcel.java:2013)
在android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
在android.os.Bundle.unparcel(Bundle.java:249)
在android.os.Bundle.getString(Bundle.java:1118)
在android.content.Intent.getStringExtra(Intent.java:5148)
在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
在com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
在com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
在android.os.Binder.execTransact(Binder.java:404)
在dalvik.system.NativeStart.run(本机方法)
致:java.lang.NoClassDefFoundError的:COM / VMS /安卓/ VersatileDEX / TestParcel
在java.lang.Class.classForName(本机方法)
在java.lang.Class.forName(Class.java:251)
在java.lang.Class.forName(Class.java:216)
在android.os.Parcel.readParcelableCreator(Parcel.java:2133)
在android.os.Parcel.readParcelable(Parcel.java:2097)
在android.os.Parcel.readValue(Parcel.java:2013)
在android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
在android.os.Bundle.unparcel(Bundle.java:249)
在android.os.Bundle.getString(Bundle.java:1118)
在android.content.Intent.getStringExtra(Intent.java:5148)
在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
在com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
在com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
在android.os.Binder.execTransact(Binder.java:404)
在dalvik.system.NativeStart.run(本机方法)
抛出java.lang.ClassNotFoundException:产生的原因没有在路径上找到的类com.vms.android.VersatileDEX.TestParcel:。DexPathList [目录],nativeLibraryDirectories = [/供应商/ lib中/系统/ lib目录] ]
在dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
在java.lang.ClassLoader.loadClass(ClassLoader.java:497)
在java.lang.ClassLoader.loadClass(ClassLoader.java:457)
在java.lang.Class.classForName(本机方法)
在java.lang.Class.forName(Class.java:251)
在java.lang.Class.forName(Class.java:216)
在android.os.Parcel.readParcelableCreator(Parcel.java:2133)
在android.os.Parcel.readParcelable(Parcel.java:2097)
在android.os.Parcel.readValue(Parcel.java:2013)
在android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
在android.os.Bundle.unparcel(Bundle.java:249)
在android.os.Bundle.getString(Bundle.java:1118)
在android.content.Intent.getStringExtra(Intent.java:5148)
在com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
在com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
在com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
在android.os.Binder.execTransact(Binder.java:404)
在dalvik.system.NativeStart.run(本机方法)
由于一些奇怪的原因,它看起来像类加载器设置不正确。
请尝试以下的 TestActivity.onCreate一()
:
TestParcel cfgOptions = getIntent()getParcelableExtra(cfgOptions)。
意向意图= getIntent();
intent.setExtrasClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = intent.getParcelableExtra(cfgOptions);
捆绑额外= getIntent()getExtras()。
extras.setClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = extras.getParcelable(cfgOptions);
另外,包裹parcelable成束:
叠B =新包();
b.putParcelable(选项,cfgOptions);
意向意图=新的意图(MDex.this,TestActivity.class);
intent.putExtra(捆绑,B);
获得:
叠B = getIntent()getBundleExtra(捆绑)。
TestParcel cfgOptions = b.getParcelable(选项);
I've been unable to resolve why this error occurs, and only on a Samsung Tab3 device, running 4.4.2? It happens when my MainActivity starts another Activity, and passes a Parcelable class in the intent like so:
private void debugTest(TestParcel cfgOptions){
TestParcel cfgOptions = new TestParcel();
cfgOptions.setValue(15); //just to verify
Intent intent = new Intent(MainActivity.this, TestActivity.class);
intent.putExtra("cfgOptions", cfgOptions);
startActivityForResult(intent, DBG_TEST);
}
TestActivity gets the parcelable data like so:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_activity);
TestParcel cfgOptions = getIntent().getExtras().getParcelable("cfgOptions");
}
The class TestParcel:
import android.os.Parcel;
import android.os.Parcelable;
public class TestParcel implements Parcelable {
private long l_ucs_value = 0;
private String s_rx_number = "";
//constructor
public TestParcel() {
l_ucs_value = 0;
s_rx_number = "";
}
public void RxNumber(String s) {
s_rx_number = s;
}
public String RxNumber() {
return s_rx_number;
}
//-----------------------------------------------------------------------
public void setValue(long v){
l_ucs_value = v;
}
public long getValue(){ return l_ucs_value; }
protected TestParcel(Parcel in) {
l_ucs_value = in.readLong();
s_rx_number = in.readString();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(l_ucs_value);
dest.writeString(s_rx_number);
}
@SuppressWarnings("unused")
public static final Parcelable.Creator<TestParcel> CREATOR = new Parcelable.Creator<TestParcel>() {
@Override
public TestParcel createFromParcel(Parcel in) {
return new TestParcel(in);
}
@Override
public TestParcel[] newArray(int size) {
return new TestParcel[size];
}
};
}
Again, I only see this on the Samsung Tab3 device - but that's the device we need it to work on. Here's the samsung logcat:
02-18 08:05:55.393 2235-2571/? E/Parcel? Class not found when unmarshalling: com.vms.android.VersatileDEX.TestParcel
java.lang.ClassNotFoundException: com.vms.android.VersatileDEX.TestParcel
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
at android.os.Parcel.readParcelable(Parcel.java:2097)
at android.os.Parcel.readValue(Parcel.java:2013)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.content.Intent.getStringExtra(Intent.java:5148)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Caused by: java.lang.NoClassDefFoundError: com/vms/android/VersatileDEX/TestParcel
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
at android.os.Parcel.readParcelable(Parcel.java:2097)
at android.os.Parcel.readValue(Parcel.java:2013)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.content.Intent.getStringExtra(Intent.java:5148)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.vms.android.VersatileDEX.TestParcel" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67)
at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:251)
at java.lang.Class.forName(Class.java:216)
at android.os.Parcel.readParcelableCreator(Parcel.java:2133)
at android.os.Parcel.readParcelable(Parcel.java:2097)
at android.os.Parcel.readValue(Parcel.java:2013)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
at android.os.Bundle.unparcel(Bundle.java:249)
at android.os.Bundle.getString(Bundle.java:1118)
at android.content.Intent.getStringExtra(Intent.java:5148)
at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1467)
at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:1063)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4134)
at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:4032)
at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:159)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2712)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
For some strange reason it looks like the class loader isn't set up properly.
Try one of the following in TestActivity.onCreate()
:
TestParcel cfgOptions = getIntent().getParcelableExtra("cfgOptions");
Intent intent = getIntent();
intent.setExtrasClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = intent.getParcelableExtra("cfgOptions");
Bundle extras = getIntent().getExtras();
extras.setClassLoader(TestParcel.class.getClassLoader());
TestParcel cfgOptions = extras.getParcelable("cfgOptions");
Alternatively, wrap the parcelable into a bundle:
Bundle b = new Bundle();
b.putParcelable("options", cfgOptions);
Intent intent = new Intent(MDex.this, TestActivity.class);
intent.putExtra("bundle", b);
to get:
Bundle b = getIntent().getBundleExtra("bundle");
TestParcel cfgOptions = b.getParcelable("options");
这篇关于Android的E /包裹:当解组(仅在三星TAB3)未找到类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!