Aufruf nativer Funktionen der Bibliothek portiert
habe ich nach dieser Anleitung, wie man port die LAME Bibliothek und mit Android NDK.
http://blog.libertadtech.com/2011/02/porting-lame-encoder-to-android-arm.html
Jedem geklappt eine hab ich die libmp3lame.damit die Datei.
Nun für einen ersten test wollte ich Sie zum aufrufen der einfachen Funktion:
void get_lame_version(char *strbuf, size_t buflen, const char *prefix);
Ich geschrieben habe ein wrapper für die LAME-Bibliothek:
package de.goddchen.android.youtubeconverter;
public class LameWrapper {
public static native void get_1lame_1version(char[] buf, int len,
char[] prefix);
}
Und ich nenne es so:
public class MainActivity extends Activity {
static {
System.loadLibrary("mp3lame");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
char[] buffer = new char[100];
LameWrapper.get_1lame_1version(buffer, 100, "".toCharArray());
((TextView) findViewById(R.id.text)).setText(buffer.toString());
}
}
Aber ich bekomme die folgende Fehlermeldung:
05-05 10:36:11.973: DEBUG/dalvikvm(199): Trying to load lib /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so 0x43757f78
05-05 10:36:12.053: DEBUG/dalvikvm(199): Added shared lib /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so 0x43757f78
05-05 10:36:12.123: DEBUG/dalvikvm(199): No JNI_OnLoad found in /data/data/de.goddchen.android.youtubeconverter/lib/libmp3lame.so 0x43757f78
05-05 10:36:12.573: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libwebcore.so' for 'get_1lame_1version' (wrong CL)
05-05 10:36:12.693: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libexif.so' for 'get_1lame_1version' (wrong CL)
05-05 10:36:12.693: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libFFTEm.so' for 'get_1lame_1version' (wrong CL)
05-05 10:36:12.703: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libmedia_jni.so' for 'get_1lame_1version' (wrong CL)
05-05 10:36:12.703: DEBUG/dalvikvm(199): +++ not scanning '/system/lib/libsrec_jni.so' for 'get_1lame_1version' (wrong CL)
05-05 10:36:12.703: WARN/dalvikvm(199): No implementation found for native Lde/goddchen/android/youtubeconverter/LameWrapper;.get_1lame_1version ([CI[C)V
05-05 10:36:12.703: DEBUG/AndroidRuntime(199): Shutting down VM
05-05 10:36:12.753: INFO/ActivityManager(52): Start proc com.android.alarmclock for broadcast com.android.alarmclock/.AlarmInitReceiver: pid=213 uid=10017 gids={}
05-05 10:36:12.773: WARN/dalvikvm(199): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
05-05 10:36:12.783: ERROR/AndroidRuntime(199): Uncaught handler: thread main exiting due to uncaught exception
05-05 10:36:12.883: ERROR/AndroidRuntime(199): java.lang.UnsatisfiedLinkError: get_1lame_1version
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at de.goddchen.android.youtubeconverter.LameWrapper.get_1lame_1version(Native Method)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at de.goddchen.android.youtubeconverter.MainActivity.onCreate(MainActivity.java:19)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.os.Handler.dispatchMessage(Handler.java:99)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.os.Looper.loop(Looper.java:123)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at android.app.ActivityThread.main(ActivityThread.java:4203)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at java.lang.reflect.Method.invokeNative(Native Method)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at java.lang.reflect.Method.invoke(Method.java:521)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
05-05 10:36:12.883: ERROR/AndroidRuntime(199): at dalvik.system.NativeStart.main(Native Method)
Kann jemand bitte zeigen Sie mir den richtigen Weg zum aufrufen der Funktionen von libmp3lame.so?
- Vielleicht muss das Letzte Wort? public static native void get_1lame_1version(char[] buf, int len, final char[] praefix);
- NÖ, funktioniert nicht 🙁
- Schau mal hier: groups.google.com/group/android-ndk/browse_thread/thread/...
- dies ist die oppsite Richtung, die ich nicht umsetzen will, die native Funktionen, die ich erklärte. Die LAME-Bibliothek bereits vorhanden und implementiert die Funktion. Was ich will zu tun ist, Sie verwenden.
- Eine weitere Idee: versuchen Methode get_1lame_1version nicht statisch.
- nope, kein Erfolg 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider können Sie nicht einfach rufen Sie eine alte C-Funktion aus Java. Haben Sie eine Funktion verwenden, mit einer "verstümmelten" Namen ein oder verwenden Sie die JNI_OnLoad Mechanismus. So oder so, die Dalvik-VM fügen Sie zusätzliche Argumente an die Funktion aufrufen, dass die regelmäßige lame
get_version_number
Funktion Sie nicht erwartet.Diese Beispiel für die Verwendung von JNI erklärt, der name mangling. Für Ihre Java-Klasse, Sie müssten über eine Funktion, mit diesem Prototyp:
Den JNIEnv-und jclass Argumente sind Teil der Aufruf-Schnittstelle. Denken Sie daran, um anzugeben
extern "C"
wenn Sie mit C++. Die javah-tool erzeugt die richtigen header-Datei für Sie.Wenn ich das machen würde, würde ich vermutlich schreiben, die JNI C-wrapper-Funktionen für den Lahmen nennt, ich brauchte. In diesem Fall statt mit einem
char *
mit einer Länge argument, und übergeben eine leerechar *
als letztes argument, ich würde eine einfachere Java-zu-C-Schnittstelle, die gerade ein Java -String
. Also in Java:Dann in C, die fordert, den aktuellen lame-API:
Den Lebenszyklus der neue Zeichenfolge erstellt, hier wird dann gesteuert auf das Java/Dalvik Seite.