【问题标题】:Invoking JNI functions in Android package name containing underscore在包含下划线的 Android 包名称中调用 JNI 函数
【发布时间】:2013-04-10 18:09:34
【问题描述】:

我正在尝试按照以下指南使用 LAME 库在 Android 中实现 MP3 编码: Lame MP3 Encoder compile for Android http://developer.samsung.com/android/technical-docs/Porting-and-using-LAME-MP3-on-Android-with-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)

【问题讨论】:

    标签: java android java-native-interface lame


    【解决方案1】:

    您应该在下划线后面加上数字 1。因此,如果您的包名称包含 ing_simmons,那么您的 JNI 将像这样形成。

    void Java_co_uk_ing_1simmons_aberdeensoundsites_Record_initEncoder
    

    如果您在调用的任何其他部分(例如 Java 文件中的类名或方法名)有下划线也是如此。

    【讨论】:

    • 这只是一个 JNI 约定吗?如果是这样,您是否有提及此内容的链接?
    • qscribble.blogspot.co.uk/2012/04/… 我隐约记得读过其中提到的死链接的目标。现在它已被删除,有几个人说根本不这样做,javah 刚刚向我承认我的“不是有效的类名”,这意味着我很想从我的下一个包名中删除下划线。
    【解决方案2】:

    _1 规则上的 JNI 规范引用

    _1 规则 scriptocalypse mentionsJNI spec 8 Chapter 2: Design Overview - Resolving Native Method Names 的一部分:

    Escape Sequence     Denotes
    _1                  the character “_” 
    

    【讨论】:

    • Unicode _0005F 也可以,即使 _1 更适合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2011-01-04
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多