我目前正在尝试从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>
答案 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
我也有同样的问题,但它解决了我的问题..
希望能帮到你......