我一直在尝试为我的Android应用执行一些本机库构建。更具体地说,借助一些预构建的共享库来执行ndk-build。其中一个模块(我们称其为pyjni)取决于那些预先构建的共享库。因此,根据android ndk development的建议,我的Android.mk由分别用于预建和待建库的两个模块组成。
这是我用于该应用程序的Android.mk文件:
LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armeabi-v7a
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(LOCAL_DIR)/libs/$(TARGET_ARCH_ABI)/libprebuilt.so
LOCAL_MODULE := prebuilt
include $(PREBUILT_SHARED_LIBRARY)
# Build libpyjni.so
include $(CLEAR_VARS)
LOCAL_MODULE := pyjni
LOCAL_SRC_FILES := pyjni.c
LOCAL_C_INCLUDES:= $(LOCAL_DIR)/include/$(TARGET_ARCH_ABI)/
LOCAL_SHARED_LIBRARIES := prebuilt
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
构建结果很好。实际上,在检查.APK时,预构建和构建的共享库都打包在@ lib / armeabi-v7a中。到目前为止一切顺利。
但是,在App执行期间尝试将生成的共享库作为 System.loadLibrary(“ pyjni”)加载时,它崩溃并通知以下错误:
java.lang.UnsatisfiedLinkError: dlopen failed: library ".../app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libprebuilt.so" not found.
我可以使用System.loadLibrary(“ prebuilt”)成功加载预构建的库。因此,在这一点上,我怀疑这是如何打包预构建的共享库还是LOCAL_SHARED_LIBRARIES如何工作的问题。在应用程序的build.gradle文件中, sourceSets.main.jniLibs.srcDirs 指向放置libprebuilt.so的目录。为了避免与预构建库文件的多个实例发生打包问题,gradle文件指定
packagingOptions{
pickFirst 'lib/armeabi-v7a/libprebuilt.so'
}
目前,我对LOCAL_SHARED_LIBRARIES创建的链接在执行中的工作方式感到困惑。