2013-04-17 16 views
14

próbuję wdrożyć kodowanie MP3 w Androidzie używając biblioteki LAME następujące tych przewodników: Lame MP3 Encoder compile for Android http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on-Android-with-JNIWywoływanie JNI funkcje Androida nazwa pakietu zawierające podkreślenia

Jednak jestem z dostaniem java.lang.UnsatisfiedLinkError które wierzę może być spowodowane faktem, że moja nazwa pakietu zawiera podkreślenie, które interpretuje jako kropkę.

Patrząc na mój kod poniżej jest to prawdopodobnie ten problem i jak sobie z tym poradzić. Czy jest coś, co to powoduje. Z góry dziękuję za pomoc.

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) { 
[....] 

błąd kot Pełna dziennika:

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) 

Odpowiedz

34

Należy przestrzegać undersc ruda z numerem 1. Jeśli twoja nazwa pakietu zawiera ing_simmons, twoje JNI zostanie utworzone w taki sposób.

void Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder 

Dotyczy to także, jeśli masz podkreślenia w jakiejkolwiek innej części rozmowy, takie jak nazwa klasy lub nazwy metody w pliku Java.

+3

Czy to tylko konwencja JNI? Jeśli tak, czy masz link, który wspomina o tym? – mpellegr

+0

http://qscribble.blogspot.co.uk/2012/04/underscores-in-jni-method-names.html i niewyraźnie pamiętam, jak czytałem cel martwego łącza wymienionego w tym miejscu. Teraz jest to usuwane, kilka osób mówi po prostu, że tego nie robię, a javah właśnie mi powiedział, że moje "nie jest poprawną nazwą klasy", co oznacza, że ​​mam ochotę odrzucić podkreślenie z mojej następnej nazwy paczki. – John

+0

@mpellegr jest częścią specyfikacji JNI: http://stackoverflow.com/a/35015592/895245 –