在Android设备上启动时出错 - FATAL EXCEPTION:main

时间:2014-04-22 04:43:56

标签: android eclipse

我目前正在尝试从NDK获得一个名为NativeAudio的教程项目。当我尝试在Nexus 7设备上运行时出现以下错误:

04-21 23:33:00.687: W/dalvikvm(6675): Exception Ljava/lang/UnsatisfiedLinkError; thrown while         initializing Lcom/example/nativeaudio/NativeAudio;
04-21 23:33:00.687: W/dalvikvm(6675): Class init failed in newInstance call (Lcom/example/nativeaudio/NativeAudio;)
04-21 23:33:00.687: D/AndroidRuntime(6675): Shutting down VM
04-21 23:33:00.687: W/dalvikvm(6675): threadid=1: thread exiting with uncaught exception (group=0x40d20930)
04-21 23:33:00.687: I/Process(6675): Sending signal. PID: 6675 SIG: 9
04-21 23:33:00.687: E/AndroidRuntime(6675): FATAL EXCEPTION: main
04-21 23:33:00.687: E/AndroidRuntime(6675): java.lang.ExceptionInInitializerError
04-21 23:33:00.687: E/AndroidRuntime(6675):     at java.lang.Class.newInstanceImpl(Native Method)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at java.lang.Class.newInstance(Class.java:1319)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.os.Looper.loop(Looper.java:137)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at java.lang.reflect.Method.invokeNative(Native Method)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at java.lang.reflect.Method.invoke(Method.java:511)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at dalvik.system.NativeStart.main(Native Method)
04-21 23:33:00.687: E/AndroidRuntime(6675): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load native-audio-jni from loader     dalvik.system.PathClassLoader[dexPath=/data/app/com.example.nativeaudio-2.apk,libraryPath=/data/app-    lib/com.example.nativeaudio-2]: findLibrary returned null
04-21 23:33:00.687: E/AndroidRuntime(6675):     at java.lang.Runtime.loadLibrary(Runtime.java:365)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at java.lang.System.loadLibrary(System.java:535)
04-21 23:33:00.687: E/AndroidRuntime(6675):     at com.example.nativeaudio.NativeAudio.<clinit>(NativeAudio.java:312)
04-21 23:33:00.687: E/AndroidRuntime(6675):     ... 15 more

主要代码是:

package com.example.nativeaudio;

import android.app.Activity;
import android.content.res.AssetManager;
import android.os.Bundle;
//import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Spinner;
import android.widget.Toast;

public class NativeAudio extends Activity {

//static final String TAG = "NativeAudio";
static final int CLIP_NONE = 0;
static final int CLIP_HELLO = 1;
static final int CLIP_ANDROID = 2;
static final int CLIP_SAWTOOTH = 3;
static final int CLIP_PLAYBACK = 4;

static String URI;
static AssetManager assetManager;

static boolean isPlayingAsset = false;
static boolean isPlayingUri = false;

static int numChannelsUri = 0;

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);

    assetManager = getAssets();

    // initialize native audio system

    createEngine();
    createBufferQueueAudioPlayer();

    // initialize URI spinner
    Spinner uriSpinner = (Spinner) findViewById(R.id.uri_spinner);
    ArrayAdapter<CharSequence> uriAdapter = ArrayAdapter.createFromResource(
            this, R.array.uri_spinner_array, android.R.layout.simple_spinner_item);
    uriAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    uriSpinner.setAdapter(uriAdapter);
    uriSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            URI = parent.getItemAtPosition(pos).toString();
        }

        public void onNothingSelected(AdapterView parent) {
            URI = null;
        }

    });

    // initialize button click handlers

    ((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            // ignore the return value
            selectClip(CLIP_HELLO, 5);
        }
    });
    }

然后是所有按钮的列表。非常长,但都具有相同的格式,其次是:

/** Called when the activity is about to be destroyed. */
@Override
protected void onPause()
{
    // turn off all audio
    selectClip(CLIP_NONE, 0);
    isPlayingAsset = false;
    setPlayingAssetAudioPlayer(false);
    isPlayingUri = false;
    setPlayingUriAudioPlayer(false);
    super.onPause();
}

/** Called when the activity is about to be destroyed. */
@Override
protected void onDestroy()
{
    shutdown();
    super.onDestroy();
}

/** Native methods, implemented in jni folder */
public static native void createEngine();
public static native void createBufferQueueAudioPlayer();
public static native boolean createAssetAudioPlayer(AssetManager assetManager, String filename);
// true == PLAYING, false == PAUSED
public static native void setPlayingAssetAudioPlayer(boolean isPlaying);
public static native boolean createUriAudioPlayer(String uri);
public static native void setPlayingUriAudioPlayer(boolean isPlaying);
public static native void setLoopingUriAudioPlayer(boolean isLooping);
public static native void setChannelMuteUriAudioPlayer(int chan, boolean mute);
public static native void setChannelSoloUriAudioPlayer(int chan, boolean solo);
public static native int getNumChannelsUriAudioPlayer();
public static native void setVolumeUriAudioPlayer(int millibel);
public static native void setMuteUriAudioPlayer(boolean mute);
public static native void enableStereoPositionUriAudioPlayer(boolean enable);
public static native void setStereoPositionUriAudioPlayer(int permille);
public static native boolean selectClip(int which, int count);
public static native boolean enableReverb(boolean enabled);
public static native boolean createAudioRecorder();
public static native void startRecording();
public static native void shutdown();

/** Load jni .so on initialization */
static {
     System.loadLibrary("native-audio-jni");
}

}

我的Manifest.xml是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.example.nativeaudio"
  android:versionCode="1"
  android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".NativeAudio"
              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>

<uses-sdk android:minSdkVersion="9" />

<!-- RECORD_AUDIO is needed to create an audio recorder -->
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

<!-- MODIFY_AUDIO_SETTINGS is needed to use audio effects such as environmental reverb -->
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"></uses-permission>

<!-- INTERNET is needed to use a URI-based audio player, depending on the URI -->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

</manifest>

2 个答案:

答案 0 :(得分:0)

AndroidManifest.xml

中添加以下代码
        <activity
            android:name="NativeAudio"
            android:label="@string/app_name">
        </activity>

答案 1 :(得分:0)

首先清理你的项目

右键单击libs文件夹中的本地库,转到Build Path -> Add to Build Path.

右键点击project ->Java Build Path ->Order and Export ->check Android Dependencies

我也有同样的问题,但它解决了我的问题..

希望能帮到你......