Phu*_*ang 7 java-native-interface android opus android-5.0-lollipop
我正在构建一个Android应用程序.使用Opus编解码器进行编码和解码.我在这里使用本地代码http://www.opus-codec.org/和这里的包装器https://github.com/jitsi/libjitsi/tree/master/src/native/opus.在Android 4.0+中,我创建了.so文件并运行,一切正常.但是在Android 5.0中,当我调用native方法时会崩溃.这是崩溃的细节:
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)
Run Code Online (Sandbox Code Playgroud)
我也搜索了很多,但找不到根本原因,没有人和我有同样的问题.下面是我的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)
Run Code Online (Sandbox Code Playgroud)
PS:如果您需要更多文件,请告诉我.
在花了一大笔时间调试同一个问题之后,启用checkjni,运行javah以确保我的头文件与我的java代码匹配,用PIE编译 - 我最终找到了问题.
Android 5.0增加了opus支持.这意味着系统已经附带了一个libopus.so文件.当你运行loadlibrary时 - 它不是你加载的编译版本,而是与Android捆绑在一起的libopus.so.
只需将您的库名称更改为libmyopus.so,这应该可以解决您的问题.MY_MODULE_DIR:= myopus和ofcourse也会更新您的System.loadlibrary调用.
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |