Invocación de funciones nativas de la biblioteca portada

He estado siguiendo esta guía sobre cómo conectar la biblioteca LAME con Android y NDK. Http://blog.libertadtech.com/2011/02/porting-lame-encoder-to-android-arm.html

Cada trabajado bien y tengo el archivo libmp3lame.so.

Ahora para una primera prueba quería llamar a la función simple:

void get_lame_version(char *strbuf, size_t buflen, const char *prefix); 

He escrito un envoltorio para la biblioteca LAME:

 package de.goddchen.android.youtubeconverter; public class LameWrapper { public static native void get_1lame_1version(char[] buf, int len, char[] prefix); } 

Y lo llamo así:

 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()); } } 

Pero consigo el error siguiente:

 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) 

¿Puede alguien por favor señalarme la forma correcta de llamar a las funciones de libmp3lame.so?

One Solution collect form web for “Invocación de funciones nativas de la biblioteca portada”

Lamentablemente, no se puede simplemente llamar a cualquier función C antigua de Java. Tienes que usar una función con un nombre "mangled" o usar el mecanismo JNI_OnLoad. De cualquier manera, la VM de Dalvik agregará argumentos adicionales a la llamada de función que no espera la función regular get_version_number lame.

Este ejemplo de uso de JNI explica el nombre mangling. Para su clase Java, necesitaría tener una función con este prototipo:

 void Java_de_goddchen_android_youtubeconverter_LameWrapper_get_11lame_11version (JNIEnv *, jclass, jcharArray, jint, jcharArray); 

Los argumentos JNIEnv y jclass forman parte de la interfaz de llamada. Recuerde especificar extern "C" si está utilizando C ++. La herramienta javah producirá el archivo de encabezado adecuado para usted.

Si yo estuviera haciendo esto, probablemente escribiría funciones JNI C wrapper para las llamadas cojas que necesitaba. En este caso en particular en lugar de usar un char * con un argumento length, y pasando un char * vacío como el último argumento, crearía una interfaz Java a C más simple que acaba de devolver una String Java. Así que en Java:

 package de.goddchen.android.youtubeconverter; public class LameWrapper { public static native String getVersion(); } 

Entonces en C, que llama a la actual API cojo:

 JNIEXPORT jstring JNICALL Java_de_goddchen_android_youtubeconverter_LameWrapper_getVersion (JNIEnv * env, jclass c) { char buffer[80]; get_lame_version(buffer, sizeof(buffer) - 1, ""); return (*env)->NewStringUTF(env, buffer)); } 

El ciclo de vida de la nueva cadena creada aquí se controla en el lado de Java / Dalvik.

  • Error durante la compilación de la muestra de jni de android: inválido -march = opción: `armv5te '
  • Llame a métodos de clase C ++ o funcione desde Java en android sin recrear clase / variable en cada llamada
  • Android NDK y C + + STL
  • Cómo utilizar bibliotecas extra * .so en Android Studio y NDK
  • Recortar video como whatsapp
  • Androide applicatin no puede encontrar la biblioteca jni cuando se instala como aplicación del sistema
  • ¿Cómo hago que el método JNI no llame estático cuando se usan objetos nativos de C ++?
  • Dalvik está buscando el archivo .so con extensión '.0' - ¿por qué?
  • Android Equalizer para nivel de API <9
  • ByteBuffer no libera memoria
  • Cómo escribir y leer bytebuffer pasar de java a jni
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.