【问题标题】:Android app loading shared library from incorrect locationAndroid 应用从错误的位置加载共享库
【发布时间】:2020-07-24 04:39:49
【问题描述】:

我正在开发一个使用 c++ 共享库的 Android 应用程序。最初,该项目运行良好。我最近将 Android Studio 升级到了 4.0.1 版。我也将我的 Gradle 版本更新为 4.x,但更新后出现奇怪问题,因此将 Gradle 版本改回 3.6.3。

代码运行到语句时

try{
    System.loadLibrary("something");
} catch(Exception e) {...}

应用程序抛出异常

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "_ZN3Eld12PtrModelRefsEv" referenced by "/data/app/com.myapp-aXvdrU70cJvaDOn1c13zEQ==/lib/arm/libsomething.so"...

在apk文件中,我可以看到库二进制文件位于 apk/debug/app-armeabi-v7a-debug.apk/lib/armeabi-v7a/libsomething.so

该应用似乎正在尝试从 lib/arm 而不是 lib/armeabi-v7a 加载共享库

在文件夹something 下,我有文件build.gradle 配置如下:

android {
    defaultConfig{
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

使用readelf -A libsomething.so 检查我的库文件属性。我有以下结果

Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "ARM v7"
  Tag_CPU_arch: v7
  Tag_CPU_arch_profile: Application
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-2
  Tag_FP_arch: VFPv3
  Tag_Advanced_SIMD_arch: NEONv1
  Tag_ABI_PCS_GOT_use: GOT-indirect
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_enum_size: int
  Tag_CPU_unaligned_access: v6
  Tag_ABI_FP_16bit_format: IEEE 754

我尝试使用System.setProperty("java.library.path", "lib/armeabi-v7a"); 更改库加载路径。但它不会改变任何东西。

那么,我怎样才能让函数System.loadLibrary从正确的位置加载二进制库文件呢?

Android Studio 版本:4.0.1
Android Gradle 插件版本:3.6.3
Gradle 版本:6.3

【问题讨论】:

    标签: c++11 android-ndk shared-libraries


    【解决方案1】:

    我终于发现我忘记在make文件中添加一个CPP文件了。 _ZN3Eld12PtrModelRefsEvPtrModelRefs 的错位函数名称,这是我错过的最重要的信息。基本上是说undefined function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2012-09-19
      • 1970-01-01
      相关资源
      最近更新 更多