Android NDK/JNI UnsatisfiedLinkError With .So library

标签 android c android-ndk rtmp

我是 Android NDK 的新手,目前正在尝试为 Android(以及后来的 iOS)构建一个 RTMP C 客户端。目前,我遇到了应用程序在我尝试加载我的库时立即崩溃的问题:

static {
    System.loadLibrary("test");
}

我得到的异常是

java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "librtmp.so.1" needed by "libtest.so"; caused by library "librtmp.so.1" not found

老实说,我完全迷路了。 ndk-build不返回任何错误:

[armeabi] Prebuilt       : rtmp.so <= jni/rtmp/
[armeabi] Install        : rtmp.so => libs/armeabi/rtmp.so
[armeabi] Compile thumb  : test <= RTMPClient.c
[armeabi] SharedLibrary  : libtest.so
[armeabi] Install        : libtest.so => libs/armeabi/libtest.so

我尝试通过 System.loadLibrary("rtmp") 加载 rtmp 库, 但没有骰子。

安卓.mk

LOCAL_PATH:= $(call my-dir)
LIBS_PATH := libs/$(TARGET_ARCH_ABI)

include $(CLEAR_VARS)
LOCAL_MODULE := rtmp
LOCAL_SRC_FILES := rtmp/rtmp.so
LOCAL_C_INCLUDES := rtmp/
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := test
LOCAL_SRC_FILES := RTMPClient.c
LOCAL_LDLIBS    := -llog
LOCAL_SHARED_LIBRARIES += rtmp

include $(BUILD_SHARED_LIBRARY)

应用程序.mk

APP_PLATFORM:=android-19

我的 RTMPClient.c 使用了来自 rtmp 的一些结构和函数像这样:

#include <rtmp/rtmp.h>

我不确定在哪里 librtmp.so.1来自,但我也在我的 libtest.so 中用 arm-linux-andrioideabi-readelf 找到了它:

0x00000001 (NEEDED)                     Shared library: [librtmp.so.1]

关于如何解决这个问题有什么想法吗?

编辑:我从 here 得到了 rtmp.so 文件.我是从 the KODI librtmp update page 送到那里的

最佳答案

我最终扔掉了我的 rtmp.so 文件,取而代之的是从 rtmpdump-android 中获取了 jni 文件。 .将这些文件放入后,将我的 android.mk 文件更改为:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_SRC_FILES += \
    librtmp/amf.c \
    librtmp/hashswf.c \
    librtmp/log.c \
    librtmp/parseurl.c \
    librtmp/rtmp.c

LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -DNO_CRYPTO
LOCAL_LDLIBS := -llog
LOCAL_MODULE := librtmp

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := dump
LOCAL_CFLAGS := -DRTMPDUMP_VERSION=\"v2.4\"
LOCAL_LDLIBS := -llog
LOCAL_SRC_FILES := dump/rtmpdump.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../librtmp
LOCAL_C_INCLUDES += dump/rtmpdump.h

LOCAL_STATIC_LIBRARIES := librtmp

include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := test
LOCAL_SRC_FILES := nelly.c nelly_tables.c RTMPClient.c
LOCAL_LDLIBS    := -llog
LOCAL_SHARED_LIBRARIES += dump

include $(BUILD_SHARED_LIBRARY)

并更改我的 RTMPClient.c 文件以包含 #include "librtmp/rtmp.h"而不是 #include <rtmp/rtmp.h> ,文件编译并在我的设备上运行没有任何问题。

关于Android NDK/JNI UnsatisfiedLinkError With .So library,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34078524/

相关文章:

android - 从路径创建 BitmapDrawable

java - 对于 Java 和 C 编译器,代码的行为有何不同?

c - 在 Ubuntu 上使用库部署 C 程序的最佳实践

android - 如何在 ADT 项目中使用 ffmpeg4android?

java - 从 Android NDK SIGSEGV 调用 Java 方法

android - React Native Android 调试 APK 已安装,但未签名未安装

java - 关于 didRangeBeaconsInRegion

android - 防止调用 OnItemSelectedListener 以响应 setSelection

c - 如何在不停止 C 程序的情况下按下最后一个键?

android ndk 多点触控?