【发布时间】:2016-10-04 13:30:56
【问题描述】:
我已经用 android ndk 编译了一个本机代码。现在,我不想将该库保留为 .apk 的一部分,而是将其安装在 android 系统(system/lib64)中并从系统加载我的应用程序。我将库推送到 system/lib64 并从 android 应用程序的 lib 文件夹中删除了这些库。但是当我尝试跑步时,我得到了
"java.lang.UnsatisfiedLinkError: dlopen failed: library "something.so" not found"
下面是我的makefile
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/Include
LOCAL_SRC_FILES := ABCProtocol/ABCProtocol.c ABCProtocol/DatalinkLayer.c ABCProtocol/PhysicalLayer.c
LOCAL_MODULE := libABCXYZProtocol
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include $(LOCAL_PATH)/Include $(LOCAL_PATH)/Util $(LOCAL_PATH)/Include/Linux/XYZ $(LOCAL_PATH)/ABCProtocol
LOCAL_SRC_FILES := Linux/XYZ/ABCXYZLinux.c Util/Util.c Util/Logger.c
#LOCAL_CFLAGS += -Wno-error=format-security
LOCAL_CFLAGS += -w
LOCAL_MODULE := libABCXYZWrapper
LOCAL_SHARED_LIBRARIES :=libABCXYZProtocol
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE:=com_example_reader_ABCXYZappnote_NativeLibrary
LOCAL_SRC_FILES:=com_example_reader_ABCXYZappnote_NativeLibrary.c
LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include $(LOCAL_PATH)/Include $(LOCAL_PATH)/Util $(LOCAL_PATH)/Include/Linux/XYZ
#LOCAL_CFLAGS += -DANDROID
LOCAL_SHARED_LIBRARIES:=libc libABCXYZWrapper libABCXYZProtocol
include $(BUILD_SHARED_LIBRARY)
【问题讨论】:
-
你能分享你的makefile(Android.mk)的代码吗?当您没有推送依赖库时,就会出现此问题。在这种情况下,链接会失败。
-
删除库后还要重新构建和安装应用程序。如果没有依赖项,但您仍然看到错误,可能是您必须通过将其放入 android 源代码并使用 mm 命令再次构建库。
-
我手动将库推送到 lib64。我可以看到那里的图书馆。我应该给 System.loadLibrary("system/lib64/smthng.so"); 吗?
-
可以分享makefile源代码吗?用于构建 libsomething.so 的 makefile。它将帮助我了解您的库是什么以及它是否有任何依赖项.. 是 libsomething.so 是您的应用程序试图加载的主库还是其他库的依赖库..
-
libABCXYZProtocol, libABCXYZWrapper 是我推送到系统下的 lib64 文件夹并从 android 代码中删除的那些。 y 是简单的 NDK 编译。最后一个其实是JNI代码。
标签: android android-ndk java-native-interface root native-code