Android NDK/JNI .So 库出现 UnsatisfiedLinkError
Android NDK/JNI UnsatisfiedLinkError With .So library
我是 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
没有 return 任何错误:
[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 库,但没有成功。
Android.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)
Application.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. I was sent there from the KODI librtmp update page
得到了 rtmp.so 文件
我最终扔掉了 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 的新手,我目前正在尝试为 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
没有 return 任何错误:
[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 库,但没有成功。
Android.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)
Application.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. I was sent there from the KODI librtmp update page
得到了 rtmp.so 文件我最终扔掉了 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>
,文件已编译并且 运行 在我的设备上没有任何问题。