这段代码是一个 Android.mk 文件,用于编译生成一个名为 libndkbuild.so 的动态库。

首先,定义了一个变量 LOCAL_PATH 来表示 Android.mk 所在的目录:

LOCAL_PATH := $(call my-dir)

然后,通过 include $(CLEAR_VARS) 清空之前可能存在的 LOCAL_ 变量。

接下来,设置了 LOCAL_MODULE 变量的值为 hello,表示生成的动态库的名称为 hello

LOCAL_MODULE := hello

LOCAL_SRC_FILES 变量指定了源文件的路径,即 prebuild/arm64-v8a/libhello.so

LOCAL_SRC_FILES:=prebuild/arm64-v8a/libhello.so

然后,通过 include $(PREBUILT_SHARED_LIBRARY) 来链接预编译的共享库。

接着,设置了 NDK_APP_DST_DIR 变量的值为 ../jniLibs/$(TARGET_ARCH_ABI),用于指定库文件的输出目录:

NDK_APP_DST_DIR=../jniLibs/$(TARGET_ARCH_ABI)

再次通过 include $(CLEAR_VARS) 清空之前可能存在的 LOCAL_ 变量。

接下来,设置了需要的系统库,即 LOCAL_LDLIBS 变量:

LOCAL_LDLIBS := -lz -lstdc++ -llog -lm

然后,指定了 LOCAL_MODULE 变量的值为 ndkbuild,表示生成的动态库的名称为 ndkbuild

LOCAL_MODULE    := ndkbuild

LOCAL_SRC_FILES 变量指定了构建系统用于生成模块的源文件列表,即 com_example_hello_HelloWorld.cpp

LOCAL_SRC_FILES := com_example_hello_HelloWorld.cpp

LOCAL_SHARED_LIBRARIES 变量指定了需要链接的第三方库,即 hello

LOCAL_SHARED_LIBRARIES:= hello

最后,通过 include $(BUILD_SHARED_LIBRARY) 来生成动态库。

至于为什么导出的 libndkbuild.solibhello.so 给第三方调用会报错,可能是因为路径不正确或者库文件没有正确加载导致的。错误信息中提到的 "D:/share/syyWorks/safecard/ProTest/app/src/main/obj/local/arm64-v8a/libhello.so" 路径不存在,可能需要检查路径是否正确以及库文件是否存在于该路径中。

解决方案:

  1. 检查路径: 确保 libhello.so 的实际路径与代码中引用的路径一致。建议将库文件放置在 jniLibs 目录下,并使用相对路径引用。

  2. 加载库文件: 确保在 Java 代码中正确加载库文件。使用 System.loadLibrary() 方法加载库文件时,只需要提供库文件的名称(不包含 lib 前缀和 .so 后缀),例如:

System.loadLibrary("hello");
  1. 添加依赖: 确保在 Android 项目中添加了对 libhello.so 的依赖。可以在 build.gradle 文件中添加以下代码:
android {
    // ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs'] // 设置库文件目录
        }
    }
}
  1. 清理构建缓存: 清理 Android Studio 的构建缓存,并重新构建项目。

  2. 检查编译选项: 确保 Android.mk 文件中的编译选项正确,例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_SHARED_LIBRARIES 等。

  3. 检查库文件的兼容性: 确保 libhello.so 库文件与目标设备的 CPU 架构兼容。

如果以上方法都无法解决问题,请提供更详细的错误信息和代码片段,以便进一步排查。

Android.mk 文件解析:编译动态库并解决第三方调用报错问题

原文地址: https://www.cveoy.top/t/topic/MFS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录