Java Android ClassNotFoundException位于另一个包中的源文件上
通过尝试访问单独包中的类,我成功地获得了由Java Android ClassNotFoundException位于另一个包中的源文件上,java,android,xml,eclipse,Java,Android,Xml,Eclipse,通过尝试访问单独包中的类,我成功地获得了由ClassNotFoundException引起的NoClassDefFoundError 我已经编写了代码,通过按下按钮调用堆栈跟踪下面的函数来重现这个问题 没有任何意义的是,即使我在项目中有源文件,它也找不到类 堆栈跟踪: 07-13 15:58:40.317: E/X(2517): x- java.lang.NoClassDefFoundError: Failed resolution of: Lobd/ObdGatewayService; 07-
ClassNotFoundException
引起的NoClassDefFoundError
我已经编写了代码,通过按下按钮调用堆栈跟踪下面的函数来重现这个问题
没有任何意义的是,即使我在项目中有源文件,它也找不到类
堆栈跟踪:
07-13 15:58:40.317: E/X(2517): x- java.lang.NoClassDefFoundError: Failed resolution of: Lobd/ObdGatewayService;
07-13 15:58:40.317: E/XX(2517): xx-
07-13 15:58:40.317: E/XX(2517): java.lang.NoClassDefFoundError: Failed resolution of: Lobd/ObdGatewayService;
07-13 15:58:40.317: E/XX(2517): at piccolo.android.PANDA18.OBDTaximeter.doBindService(OBDTaximeter.java:856)
07-13 15:58:40.317: E/XX(2517): at piccolo.android.PANDA18.OBDTaximeter.startLiveData(OBDTaximeter.java:823)
07-13 15:58:40.317: E/XX(2517): at piccolo.android.PANDA18.OBDTaximeter.access$8(OBDTaximeter.java:818)
07-13 15:58:40.317: E/XX(2517): at piccolo.android.PANDA18.OBDTaximeter$3.onClick(OBDTaximeter.java:313)
07-13 15:58:40.317: E/XX(2517): at android.view.View.performClick(View.java:5217)
07-13 15:58:40.317: E/XX(2517): at android.view.View$PerformClick.run(View.java:20983)
07-13 15:58:40.317: E/XX(2517): at android.os.Handler.handleCallback(Handler.java:739)
07-13 15:58:40.317: E/XX(2517): at android.os.Handler.dispatchMessage(Handler.java:95)
07-13 15:58:40.317: E/XX(2517): at android.os.Looper.loop(Looper.java:145)
07-13 15:58:40.317: E/XX(2517): at android.app.ActivityThread.main(ActivityThread.java:6117)
07-13 15:58:40.317: E/XX(2517): at java.lang.reflect.Method.invoke(Native Method)
07-13 15:58:40.317: E/XX(2517): at java.lang.reflect.Method.invoke(Method.java:372)
07-13 15:58:40.317: E/XX(2517): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
07-13 15:58:40.317: E/XX(2517): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
07-13 15:58:40.317: E/XX(2517): Caused by: java.lang.ClassNotFoundException: Didn't find class "obd.ObdGatewayService" on path: DexPathList[[zip file "/system/framework/com.google.android.maps.jar", zip file "/data/app/piccolo.android.PANDA18-2/base.apk"],nativeLibraryDirectories=[/data/app/piccolo.android.PANDA18-2/lib/arm, /vendor/lib, /system/lib]]
07-13 15:58:40.317: E/XX(2517): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
07-13 15:58:40.317: E/XX(2517): at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
07-13 15:58:40.317: E/XX(2517): at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
07-13 15:58:40.317: E/XX(2517): ... 14 more
07-13 15:58:40.317: E/XX(2517): Suppressed: java.lang.NoClassDefFoundError: obd.ObdGatewayService
07-13 15:58:40.317: E/XX(2517): at dalvik.system.DexFile.defineClassNative(Native Method)
07-13 15:58:40.317: E/XX(2517): at dalvik.system.DexFile.defineClass(DexFile.java:226)
07-13 15:58:40.317: E/XX(2517): at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219)
07-13 15:58:40.317: E/XX(2517): at dalvik.system.DexPathList.findClass(DexPathList.java:321)
07-13 15:58:40.317: E/XX(2517): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54)
07-13 15:58:40.317: E/XX(2517): ... 16 more
07-13 15:58:40.317: E/XX(2517): Suppressed: java.lang.ClassNotFoundException: obd.ObdGatewayService
07-13 15:58:40.317: E/XX(2517): at java.lang.Class.classForName(Native Method)
07-13 15:58:40.317: E/XX(2517): at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
07-13 15:58:40.317: E/XX(2517): at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
07-13 15:58:40.317: E/XX(2517): at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
07-13 15:58:40.317: E/XX(2517): ... 15 more
07-13 15:58:40.317: E/XX(2517): Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available
请注意,上面的stacktrace仅在我第一次按下按钮时生成。随后的按钮按下会产生一个较短、稍有不同的版本(见下文)
导致错误的代码部分:
// this is from the OBDTaximeter class, and is called whenever I press a specific button. I have a try/catch where I'm calling it to log the error above
private void doBindService() {
if (!isServiceBound) {
Log.d(TAG, "Binding OBD service..");
if (preRequisites) {
Intent serviceIntent = new Intent(this, ObdGatewayService.class); // Specifically, this line
bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
} else {
Intent serviceIntent = new Intent(this, MockObdGatewayService.class);
bindService(serviceIntent, serviceConn, Context.BIND_AUTO_CREATE);
}
}
}
解决方案资源管理器的屏幕截图:
黄色突出显示的部分显示该文件确实位于同一项目中,但位于不同的包中,其中红线表示调用试图使用缺少的类的代码的位置
我考虑过这可能是我的清单声明有问题,但我找不到任何错误-我可能错了,所以我将包含一个压缩版本,其中包含以下相关位
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="piccolo.android.PANDA18"
android:versionCode="1"
android:versionName="1.0">
<activity android:name="OBDTaximeter" />
<activity android:name="obd.ConfigActivity" />
<service android:enabled="true" android:name="obd.MockObdGatewayService" />
<service android:enabled="true" android:name="obd.ObdGatewayService" />
</application>
</manifest>
为什么会发生这种情况?像这样开始:
Intent intent = new Intent();
intent.setClassName("obd", "obd.ObdGatewayService");
startService(intent);
您使用的是Multidex还是自定义ProGuard规则?两者都不使用@Bladecoder你能解释一下你的代码和我的启动意图的代码之间的区别吗?我很惊讶这样就避免了这个问题,因为我的所有其他活动都开始使用代码中详述的格式。虽然这是一个解决异常的方法,但它并不能解决当前的问题。
Class #239 -
Class descriptor : 'Lobd/ObdGatewayService$1;'
Access flags : 0x0000 ()
Superclass : 'Ljava/lang/Object;'
Interfaces -
#0 : 'Ljava/lang/Runnable;'
Static fields -
Instance fields -
#0 : (in Lobd/ObdGatewayService$1;)
name : 'this$0'
type : 'Lobd/ObdGatewayService;'
access : 0x1010 (FINAL SYNTHETIC)
#1 : (in Lobd/ObdGatewayService$1;)
name : 'val$job2'
type : 'Lobd/ObdCommandJob;'
access : 0x1012 (PRIVATE FINAL SYNTHETIC)
Direct methods -
#0 : (in Lobd/ObdGatewayService$1;)
name : '<init>'
type : '(Lobd/ObdGatewayService;Lobd/ObdCommandJob;)V'
access : 0x10000 (CONSTRUCTOR)
code -
registers : 3
ins : 3
outs : 1
insns size : 8 16-bit code units
catches : (none)
positions :
0x0000 line=1
0x0004 line=240
locals :
0x0000 - 0x0008 reg=0 this Lobd/ObdGatewayService$1;
Virtual methods -
#0 : (in Lobd/ObdGatewayService$1;)
name : 'run'
type : '()V'
access : 0x0001 (PUBLIC)
code -
registers : 3
ins : 1
outs : 2
insns size : 12 16-bit code units
catches : (none)
positions :
0x0000 line=243
0x000b line=244
locals :
0x0000 - 0x000c reg=2 this Lobd/ObdGatewayService$1;
source_file_idx : 4574 (ObdGatewayService.java)
Intent intent = new Intent();
intent.setClassName("obd", "obd.ObdGatewayService");
startService(intent);