2013-04-17 5 views
14

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) 

Antwort

34

Sie sollten die undersc folgen Oder wenn Ihr Paketname ing_simmons enthält, dann würde Ihr JNI so aussehen.

void Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder 

Dies gilt auch, wenn Sie Unterstreichen in einem anderen Teil des Anrufs, wie Klassennamen oder Methodennamen in der Java-Datei.

+3

diese Konvention nur eine JNI ist? Wenn ja, hast du einen Link, der das erwähnt? – mpellegr

+0

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

+0

@mpellegr es ist Teil der JNI-Spezifikation: http://StackOverflow.com/A/35015592/895245 –