-->

在含有下划线Android包名调用JNI函数(Invoking JNI functions in A

2019-08-31 10:14发布

我试图使用LAME库下面的这些指南,以实现Android的MP3编码: Lame MP3编码编译为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)

Answer 1:

您应该按照下划线数字1所以,如果你的包名称包含ing_simmons那么你的JNI会像这样形成。

void Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder

如果你在通话的任何其他部分下划线,如Java文件中的类名或方法名来说也同样如此。



Answer 2:

JNI规范

_1规则scriptocalypse提到是的一部分JNI规范8第2章:设计概述-解析本地方法的名称 :

Escape Sequence     Denotes
_1                  the character “_” 


文章来源: Invoking JNI functions in Android package name containing underscore