Android NDK Makefile 代码解析及常见错误:'java.lang.UnsatisfiedLinkError' 解决方案
表示Android.mk所在目录
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :=hello #因为链接第三方库,此时源文件为so #LOCAL_SRC_FILES:=prebuild/arm64-v8a/libSKFInterface.so LOCAL_SRC_FILES:=prebuild/arm64-v8a/libhello.so #链接时为预编译 include $(PREBUILT_SHARED_LIBRARY)
#设置库文件的输入目录 #输出目录 ../jniLibs/ #源目录 $(TARGET_ARCH_ABI) NDK_APP_DST_DIR=../jniLibs/$(TARGET_ARCH_ABI) #CLEAR_VARS变量指向特殊 GNU Makefile,用于清除部分LOCAL_变量 include $(CLEAR_VARS)
#需要的系统库 #LOCAL_LDLIBS := -lz -lstdc++ -llog -lm #模块名称 LOCAL_MODULE := ndkbuild #构建系统用于生成模块的源文件列表 LOCAL_SRC_FILES := com_example_hello_HelloWorld.cpp #LOCAL_SRC_FILES += safecardapi.cpp #链接的第三方库 LOCAL_SHARED_LIBRARIES:= hello #BUILD_SHARED_LIBRARY 表示.so动态库 #BUILD_STATIC_LIBRARY 表示.a静态库 include $(BUILD_SHARED_LIBRARY)
这段代码是一个 Android NDK 的 makefile 文件,用于编译生成一个动态库 (.so 文件)。
首先,使用 LOCAL_PATH := $(call my-dir) 指定了当前目录为 Android.mk 所在目录。
然后,通过 include $(CLEAR_VARS) 和 include $(PREBUILT_SHARED_LIBRARY),清除变量并包含预构建的共享库。
接着,设置了库文件的输入目录为 ../jniLibs/$(TARGET_ARCH_ABI),其中 $(TARGET_ARCH_ABI) 是一个 NDK 的环境变量,表示目标架构。
然后,使用 include $(CLEAR_VARS) 清除变量,并设置了模块名称为 ndkbuild,以及构建系统用于生成模块的源文件列表为 com_example_hello_HelloWorld.cpp。
最后,使用 include $(BUILD_SHARED_LIBRARY) 进行动态库的构建,指定了链接的第三方库为 hello。
你提到的报错 java.lang.UnsatisfiedLinkError: dlopen failed: library "D:/share/syyWorks/safecard/ProTest/app/src/main/obj/local/arm64-v8a/libhello.so" not found,可能是因为你导出的 .so 文件没有被正确地放置到 Android 工程的 libs/arm64-v8a 目录下。请确认你的文件路径和名称是否正确,并确保将 .so 文件正确放置到对应的目录中。
此外,还需要注意以下几点:
- 确保在 Android 工程的
build.gradle文件中添加ndk配置,例如:
android {
...
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
ndk {
moduleName "your-module-name"
abiFilters "arm64-v8a" // 这里需要根据你的目标架构进行调整
}
}
}
-
确保在 Android Studio 的
Project Structure中设置了Native Dependencies,将你的.so文件添加进去。 -
确保你的 Android 工程的
libs/arm64-v8a目录存在,并且将.so文件放置到该目录下。 -
如果你在编译时遇到了其他错误,例如
undefined reference,可能是链接库的顺序问题,可以通过修改LOCAL_SHARED_LIBRARIES的顺序进行解决。
希望以上解析和解决方法能够帮助你解决问题。
原文地址: http://www.cveoy.top/t/topic/LJp 著作权归作者所有。请勿转载和采集!