与 android 5.0 一起使用时出现 java.lang.UnsatisfiedLinkError

Posted

技术标签:

【中文标题】与 android 5.0 一起使用时出现 java.lang.UnsatisfiedLinkError【英文标题】:java.lang.UnsatisfiedLinkError when using with android 5.0 【发布时间】:2015-02-05 22:26:13 【问题描述】:

我正在构建一个安卓应用程序。使用 Opus 编解码器进行编码和解码。我正在使用来自这里的本机代码 http://www.opus-codec.org/ 和来自这里的包装器 https://github.com/jitsi/libjitsi/tree/master/src/native/opus 。在 android 4.0+ 中,我创建了 .so 文件并运行,一切正常。但在 Android 5.0 中,当我调用本机方法时它会崩溃。这是崩溃的详细信息:

 java.lang.UnsatisfiedLinkError: No implementation found for long my.package.name.codec.Opus.encoder_create(int, int) (tried Java_my_package_name_codec_Opus_encoder_1create and Java_my_package_name_codec_Opus_encoder_1create__II)

我也搜索了很多,但找不到根本原因,没有人跟我有同样的问题。下面是我的mk文件,我觉得很有用。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

MY_MODULE_DIR       := opus

LOCAL_MODULE        := $(MY_MODULE_DIR)
LOCAL_SRC_FILES     := $(wildcard ( libopus/src/*.c \
    libopus/celt/*.c \
    libopus/celt/arm/*.c \
    libopus/silk/*.c \
    libopus/silk/arm/*.c \
    libopus/include/*.c \
    libopus/silk/fixed/*.c \
    my_package_name_codec_Opus.c ))

LOCAL_C_INCLUDES    := \
    libopus/src \
    libopus/include \
    libopus/silk \
    libopus/silk/fixed \
    libopus/silk/arm \
    libopus/celt \
    libopus/celt/arm \
    libopus \

LOCAL_CFLAGS        := -DNULL=0 -DSOCKLEN_T=socklen_t -DLOCALE_NOT_USED -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64
LOCAL_CFLAGS    += -Drestrict='' -D__EMX__ -DOPUS_BUILD -DFIXED_POINT -DUSE_ALLOCA -DHAVE_LRINT -DHAVE_LRINTF -O3 -fno-math-errno
LOCAL_CPPFLAGS      := -DBSD=1 
LOCAL_CPPFLAGS          += -ffast-math -O3 -funroll-loops

include $(BUILD_SHARED_LIBRARY)

PS:如果您需要更多文件,请告诉我。

【问题讨论】:

【参考方案1】:

在自己花费大量时间调试同一个问题、启用 checkjni、运行 javah 以确保我的标头与我的 java 代码匹配、使用 PIE 编译后,我最终找到了问题。

Android 5.0 增加了对作品的支持。这意味着系统已经带有一个 libopus.so 文件。 当您运行 loadlibrary 时 - 加载的不是您的编译版本,而是与 Android 捆绑在一起的 libopus.so。

只需将您的库名称更改为 libmyopus.so,这应该可以解决您的问题。 MY_MODULE_DIR := myopus 当然也更新您的 System.loadlibrary 调用。

【讨论】:

所以在做了一周的工作之后,检查 jni,使用 javah 等...我偶然发现了这个问题并尝试了你所做的。有效!当,伙计。这是一个很好的收获!我正要尝试System.load() 并给它一个加载库的绝对路径。我现在不必尝试了。哈!

以上是关于与 android 5.0 一起使用时出现 java.lang.UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章

当我将 IterativeImputer 与 KNeighborsClassifier 一起使用时出现错误“未知标签类型:'连续'”

将 Jackson JSON 库与骆驼一起使用时出现异常

将插入与 KeyHolder 一起使用时出现 ArrayIndexOutOfBoundsException

将 Typescript 与 React-Redux 一起使用时出现类型错误

将 AutoMapper 与实体框架一起使用时出现异常

尝试在 iOS 中将 UITabBarController 与 UITableViewController 一起使用时出现异常