Вызов функций JNI в имени пакета Android, содержащем знак подчеркивания

Я пытаюсь реализовать кодировку MP3 в Android, используя библиотеку LAME, следуя этим руководствам: Lame MP3 Encoder компилируется для Android http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on -Android-с-JNI

Однако я получаю java.lang.UnsatisfiedLinkError, который, я полагаю, может быть связан с тем, что мое имя пакета содержит символ подчеркивания, который он интерпретирует как полную остановку.

Глядя на мой код ниже, вероятно, эта проблема и как мне обойти это. Или есть что-то еще, что вызывает это. Заранее благодарю за любую помощь.

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

Ошибка полного журнала :

 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) 

Solutions Collecting From Web of "Вызов функций JNI в имени пакета Android, содержащем знак подчеркивания"

Вы должны следить за подчеркиванием с номером 1. Поэтому, если ваше имя пакета содержит ing_simmons, ваш JNI будет сформирован так.

 void Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder 

Это также верно, если у вас есть символы подчеркивания в любой другой части вызова, такие как имя класса или имя метода в файле Java.

Спецификация JNI

Указание _1 правила scriptocalypse является частью спецификации JNI 8 Глава 2: Обзор дизайна – Разрешение имен собственных методов :

 Escape Sequence Denotes _1 the character “_”