【问题标题】:Android java.lang.RuntimeException errorAndroid java.lang.RuntimeException 错误
【发布时间】:2013-12-29 16:07:48
【问题描述】:

我正在尝试为 Unity 构建我的 Android 插件。但是当我这样做时,我在 Logcat 中得到以下错误日志:

12-11 14:45:38.745: E/AndroidRuntime(26806): FATAL EXCEPTION: main
12-11 14:45:38.745: E/AndroidRuntime(26806): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.marc/com.example.marc.CompassActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.marc.CompassActivity" on path: DexPathList[[zip file "/data/app/com.example.marc-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.marc-1, /vendor/lib, /system/lib]]
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.os.Looper.loop(Looper.java:137)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.ActivityThread.main(ActivityThread.java:5103)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at java.lang.reflect.Method.invokeNative(Native Method)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at java.lang.reflect.Method.invoke(Method.java:525)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at dalvik.system.NativeStart.main(Native Method)
12-11 14:45:38.745: E/AndroidRuntime(26806): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.marc.CompassActivity" on path: DexPathList[[zip file "/data/app/com.example.marc-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.marc-1, /vendor/lib, /system/lib]]
12-11 14:45:38.745: E/AndroidRuntime(26806):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
12-11 14:45:38.745: E/AndroidRuntime(26806):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
12-11 14:45:38.745: E/AndroidRuntime(26806):    ... 11 more

我搜索了为什么会发生这种情况,我发现这是因为我的意图有问题。我需要将我的活动添加到我的清单文件中。但是,这是我的清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.marc"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="7"
    android:targetSdkVersion="7" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity android:name="com.example.marc.CompassActivity"
        android:label="@string/app_name">
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    </activity>
</application>

据我所见,我的意图在&lt;activity android:name="com.example.marc.CompassActivity" 行中,除非我对此的想法完全错误?

为了完整起见,这是我的 java 文件:

  package com.example.marc;
import com.unity3d.player.UnityPlayerActivity;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Config;
import android.util.Log;
import android.app.Activity;

public class CompassActivity extends UnityPlayerActivity 
{
    private static final String TAG = "Compass";

    private SensorManager mSensorManager;
    private Sensor mSensor;

    static public float xmag;
    static public float ymag;
    static public float zmag;

    private final SensorEventListener mListener = new SensorEventListener() 
    {
        public void onSensorChanged(SensorEvent event)
        {
        if (Config.DEBUG) Log.d(TAG,
        "sensorChanged (" + event.values[0] + ", " + event.values[1] + ", " + event.values[2] + ")");

            xmag = event.values[0];
            ymag = event.values[1];
            zmag = event.values[2];
        }

        public void onAccuracyChanged(Sensor sensor, int accuracy) 
        {
        }
    };

    @Override
    protected void onCreate(Bundle icicle)
    {
        super.onCreate(icicle);
        mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
    }

    @Override
    protected void onResume()
    {
        if (Config.DEBUG) Log.d(TAG, "onResume");
        super.onResume();

        mSensorManager.registerListener(mListener, mSensor,
        SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onStop()
    {
        if (Config.DEBUG) Log.d(TAG, "onStop");
        mSensorManager.unregisterListener(mListener);
        super.onStop();
    }

    public static float getX()
    {
        return xmag;
    }

    public static float getY() 
    {
        return ymag;
    }

    public static float getZ()
    {
        return zmag;
    }
}

再次,根据我的想法,这就是我应该传递给我的清单文件的内容,例如,它被称为“CompassActivity”。显然,虽然我一定做错了什么,否则我不会得到我所犯的错误。有人可以告诉我我做错了什么/错过了什么吗?

编辑

最新的 LogCat 文件:

   12-11 16:32:16.957: E/AndroidRuntime(29055): FATAL EXCEPTION: main
12-11 16:32:16.957: E/AndroidRuntime(29055): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.marc/com.example.marc.CompassActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.marc.CompassActivity" on path: DexPathList[[zip file "/data/app/com.example.marc-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.marc-2, /vendor/lib, /system/lib]]
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2137)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.os.Looper.loop(Looper.java:137)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.ActivityThread.main(ActivityThread.java:5103)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at java.lang.reflect.Method.invokeNative(Native Method)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at java.lang.reflect.Method.invoke(Method.java:525)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at dalvik.system.NativeStart.main(Native Method)
12-11 16:32:16.957: E/AndroidRuntime(29055): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.marc.CompassActivity" on path: DexPathList[[zip file "/data/app/com.example.marc-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.marc-2, /vendor/lib, /system/lib]]
12-11 16:32:16.957: E/AndroidRuntime(29055):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
12-11 16:32:16.957: E/AndroidRuntime(29055):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2128)
12-11 16:32:16.957: E/AndroidRuntime(29055):    ... 11 more

【问题讨论】:

  • 您是否尝试对项目进行清理?
  • 我刚做了。但是,我通过 Unity 将上述内容构建为插件,并且打开了 eclipse,这就是我获取日志的方式。

标签: java android android-intent


【解决方案1】:

按照@TNR 的回答 - 实际上未找到您的 UnityPlayerActivity 类,但 LogCat 显示为未找到 CompassActivity

你可以尝试做的是:

  1. 使用清单中的原始 UnityPlayerActivity 重新构建您的项目(仅用于测试)。它在工作吗? (如果没有,请先解决此问题)

  2. 使用JD反编译CompassActivity所在的JAR。它是否继承自 UnityPlayerActivity?就我而言,编译器存在问题,它将继承更改为未找到的 NPUnityPlayerActivity。如果出现此问题,您需要重新编译代码并确保继承正确。

祝你好运!

【讨论】:

    【解决方案2】:

    我觉得

     <activity android:name="com.example.marc.CompassActivity"
    

    应该是

       <activity android:name="CompassActivity"
    

    (你已经在包属性中提到了“com.example.marc” android:name 的值只能是活动类的名称。 由于您的清单文件说主要活动类是“com.example.marc.CompassActivity”,运行时环境会查找它,但它没有找到它,因为您的主要活动类文件被命名为“CompassAcitvity”)

    [编辑]

    主要问题是运行时无法实例化 MainActivity,因为它无法在 DexPathList 中找到类“com.example.marc.CompassActivity”

    见方法"findClass()" line 310-323

    如果成功找到一个类,则返回一个类对象 null 它返回到BaseDexClassLoader(see line 58) 并且在这种情况下收到 null 时抛出 ClassNotFoundException。 p>

    我认为主要活动类在构建过程中被排除在外,或者它的名称与清单中提到的不同。

    【讨论】:

    • @Selvin ....我在这里错了...我将活动名称作为唯一的类名(开头没有任何句点)并且每次都有效。我应该在回答之前尝试复制错误。但是 stacktrace 给我的印象是这可能是问题
    • @selvin 如果您看到错误消息“Caused by: java.lang.ClassNotFoundException: 未找到类“com.example.marc.CompassActivity””,您对此有何看法?
    • 试过了,但我仍然收到同样的信息。
    • @N0xus ..你能把新的堆栈跟踪放在评论中
    【解决方案3】:

    您的UnityPlayerActivity 类实际上未找到,但编译器显示为CompassActivity 未找到。

    如果您在库中有 UnityPlayerActivity 并且链接到您的应用程序,请仔细检查您的项目-->右键单击-->属性-->Java 构建路径--->订购和导出是否已检查您的项目。

    【讨论】:

    • 我检查并添加了我的 classes.jar 文件,它位于 Unity\Editor\Data\PlaybackEngines\androidplayer\bin 中是什么意思?
    • 正如我在回答中所说,请检查 Android Private Dependencies 是否已在 Order 和 Export 中检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    相关资源
    最近更新 更多