在包含下划线的Android包名称中调用JNI函数
我试图在Android中使用LAME库实现MP3编码,请遵循以下指南:Android的Lame MP3编码器编译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)
你应该按照数字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 “_”
链接地址: http://www.djcxy.com/p/17409.html
上一篇: Invoking JNI functions in Android package name containing underscore
下一篇: How does Access