You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android NDK预编译SO库运行时加载路径异常问题排查

解决Android动态库加载时寻找本地Windows路径预编译库的问题

问题根源

你遇到的核心问题是TestDriver在编译链接阶段被硬编码了本地Windows路径的依赖查找规则,导致运行时系统跳过APK内置的libs目录,直接去你编译时的本地路径找libRokuDriver.so。大概率是以下两种情况:

  • 预编译的libRokuDriver.so本身带有Windows环境下编译生成的本地路径rpath信息
  • Android.mk配置中误用了Windows绝对路径引用预编译库,导致链接时写入了无效路径

具体解决步骤

1. 修正Android.mk的预编译库引用

确保用相对NDK工程的路径引用预编译库,绝对不能写Windows绝对路径:

# 定义预编译库模块
include $(CLEAR_VARS)
LOCAL_MODULE := RokuDriver
LOCAL_SRC_FILES := ../libs/$(TARGET_ARCH_ABI)/libRokuDriver.so  # 用相对路径,适配多架构
include $(PREBUILT_SHARED_LIBRARY)

# 定义TestDriver封装库
include $(CLEAR_VARS)
LOCAL_MODULE := TestDriver
LOCAL_SRC_FILES := TestDriver.c
LOCAL_SHARED_LIBRARIES := RokuDriver  # 正确关联预编译库
include $(BUILD_SHARED_LIBRARY)

2. 彻底清除编译缓存

Windows环境下NDK编译缓存容易残留旧路径信息,执行以下操作:

  • 删除工程根目录的.externalNativeBuild文件夹
  • 删除app/build下的intermediates和outputs文件夹
  • 执行命令:gradlew clean

3. 检查并修复预编译库的rpath信息

用NDK自带的readelf工具(对应目标架构,比如aarch64-linux-android-readelf)检查libRokuDriver.so的依赖路径:

aarch64-linux-android-readelf -d libRokuDriver.so | grep RPATH

如果输出包含Windows本地路径,说明库本身带硬编码路径,需要:

  • 重新编译libRokuDriver.so时添加参数:-Wl,-rpath='$ORIGIN'(让库优先从自身所在目录加载依赖)
  • 或者用patchelf工具修改现有库:
    patchelf --set-rpath '$ORIGIN' libRokuDriver.so
    

4. 确保Gradle正确打包预编译库

在app/build.gradle中明确指定jniLibs目录,保证预编译库被打包进APK:

android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
    externalNativeBuild {
        ndkBuild {
            path 'src/main/jni/Android.mk'
        }
    }
}

5. 调整Java层加载顺序

在Java代码中先加载依赖库,再加载封装库,避免加载顺序问题:

static {
    System.loadLibrary("RokuDriver");
    System.loadLibrary("TestDriver");
}

内容的提问来源于stack exchange,提问作者Lukas Hanacek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:10:04