【问题标题】:Moving native libraries from android app to system lib and accessing it from app将原生库从 android 应用程序移动到系统库并从应用程序访问它
【发布时间】: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


【解决方案1】:

不允许应用程序从系统库位置访问非公共 API:https://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk。您的应用使用的库必须与您的应用一起打包。

你为什么要把它们放在 /system/lib 中?

【讨论】:

  • 我正在尝试使用 Android 6.0 SDK 来实现,我的目标设备也是 6.0。我想这样做是因为我在本机库中有一些操作(访问硬件),如果我使用 APK 打包这些操作将无法工作。我认为如果我使用 system/lib 中的库,它会起作用
  • 您将无法发布该应用程序。您不能修改用户的 /system 分区。
  • 我不打算发布应用程序.. 它是用于参考板。我们仅在公司内部使用它
  • NDK 不是您想要的。您需要查看 AOSP 构建过程并实际编写系统库并将其作为系统映像的一部分,而不是使用 NDK。应用程序可以通过 dlopen 加载特定于供应商的扩展程序(尽管我不确定这在 7.0 和更新的世界中是如何工作的)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2019-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多