Ich versuche, MP3-Codierung in Android mit der LAME-Bibliothek im Anschluss an diese Führungen zu implementieren: Lame MP3 Encoder compile for Android http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on-Android-with-JNIHervorrufen von JNI-Funktionen in Android Paketnamen enthalten Strich
aber ich bin immer ein java.lang.UnsatisfiedLinkError die ich glaube, könnte daran liegen, dass mein Paketname einen Unterstrich enthält, den er als Punkt interpretiert.
Mit Blick auf meinen Code unten ist dies wahrscheinlich dieses Problem und wie komme ich um das herum. Oder gibt es etwas anderes, das dies verursacht? Vielen Dank im Voraus für jede Hilfe.
Record.java:
package co.uk.ing_simmons.aberdeensoundsites;
public class Record extends Activity implements OnClickListener {
static {
System.loadLibrary("mp3lame");
}
private native void initEncoder(int numChannels, int sampleRate, int bitRate, int mode, int quality);
private native void destroyEncoder();
private native int encodeFile(String sourcePath, String targetPath);
[.....]
}
wrapper.c:
void Java_co_uk_ing_simmons_aberdeensoundsites_Record_initEncoder(JNIEnv *env,
jobject jobj, jint in_num_channels, jint in_samplerate, jint in_brate,
jint in_mode, jint in_quality) {
[....]
Vollständige Log-Katze Fehler:
04-17 20:58:36.009: E/AndroidRuntime(26768): FATAL EXCEPTION: main
04-17 20:58:36.009: E/AndroidRuntime(26768): java.lang.UnsatisfiedLinkError: initEncoder
04-17 20:58:36.009: E/AndroidRuntime(26768): at co.uk.ing_simmons.aberdeensoundsites.Record.initEncoder(Native Method)
04-17 20:58:36.009: E/AndroidRuntime(26768): at co.uk.ing_simmons.aberdeensoundsites.Record.onCreate(Record.java:79)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1615)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1667)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.os.Handler.dispatchMessage(Handler.java:99)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.os.Looper.loop(Looper.java:123)
04-17 20:58:36.009: E/AndroidRuntime(26768): at android.app.ActivityThread.main(ActivityThread.java:3687)
04-17 20:58:36.009: E/AndroidRuntime(26768): at java.lang.reflect.Method.invokeNative(Native Method)
04-17 20:58:36.009: E/AndroidRuntime(26768): at java.lang.reflect.Method.invoke(Method.java:507)
04-17 20:58:36.009: E/AndroidRuntime(26768): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-17 20:58:36.009: E/AndroidRuntime(26768): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-17 20:58:36.009: E/AndroidRuntime(26768): at dalvik.system.NativeStart.main(Native Method)
diese Konvention nur eine JNI ist? Wenn ja, hast du einen Link, der das erwähnt? – mpellegr
http://qscribble.blogspot.co.uk/2012/04/underscores-in-jni-method-names.html und ich erinnere mich vage daran, das Ziel des darin erwähnten Deadlinks zu lesen. Dass es jetzt entfernt wird, sagen einige Leute einfach nicht und javah hat mir gerade erklärt, dass meins "kein gültiger Klassenname" ist, dh ich bin versucht, den Unterstrich von meinem nächsten Paketnamen wegzulassen. – John
@mpellegr es ist Teil der JNI-Spezifikation: http://StackOverflow.com/A/35015592/895245 –