android - 将另一个目录中的 .so(预构建)库添加到 APK

标签 android android-ndk

我正在尝试从另一个目录中包含我的 .so 库。编译我的项目工作正常。但是当我运行它时,它给了我

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.company.gimikapp-2/base.apk"],nativeLibraryDirectories=[/data/app/com.company.gimikapp-2/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libtheprebuiltlib.so"

我在 SO 中看到的常见解决方案是这样的:

sourceSets {
    main {
        jniLibs.srcDirs = ['src/main/jniLibs']
    }
}

两个都试过了

jniLibs.srcDirs = ['C:\\svn\\sys_libs']

jniLibs.srcDirs = ['C:/svn/sys_libs']

您实际上如何将它指向您的 Android 项目之外的另一个目录?

这是我的 CMakeList.txt:

cmake_minimum_required(VERSION 3.4.1)
add_library( native-lib
            SHARED
            src/main/cpp/source/native-lib.cpp )
add_library(theprebuiltlib SHARED IMPORTED)
set_target_properties(theprebuiltlib PROPERTIES IMPORTED_LOCATION
            C:/svn/sys_libs/libtheprebuiltlib.so)
target_include_directories(
            native-lib PRIVATE
            src/main/cpp/source/
            C:/svn/sys_includes/)
find_library( log-lib
            log)
target_link_libraries( native-lib
            theprebuiltlib
            ${log-lib})

这是我的 JNI 的 gradle 设置:

android {
    ...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
            }
            ndk {
                abiFilters 'armeabi'
            }
        }
        ...
    }
    ...
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['C:/svn/sys_libs']
        }
    }
}

最佳答案

显然,您安装了 NDK r17 和 Android 插件 v.3.1.0 或更高版本(我们在已发布的 build.gradle fragment 中没有看到这一点)。

但是你把abiFilters设置为armeabi,这已经被丢弃了。您应该将其设置为 armeabi-v7a,并确保 libtheprebuiltlib.so 也是为此 ABI 构建的,或者您可以 download an older version of NDK并在 build.gradle 依赖设置中

classpath 'com.android.tools.build:gradle:3.0.1'

如果您明确设置最新的插件句柄 armeabi,则可以强制使用它:

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi'
        }
    }
}

(在您的脚本中,它位于 android.defaultConfig.externalNativeBuild.ndk 下,因此无效)。

build.gradle 中的一个错误,应该是

android {
  sourceSets {
     main { 
       jniLibs.srcDir 'C:/svn/sys_libs' 
     }
   }
}

当您拥有文件 C:\svn\sys_libs\armeabi\libtheprebuiltlib.so 时。但这并不能解释为什么 cmake 没有按预期工作。

关于android - 将另一个目录中的 .so(预构建)库添加到 APK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50713933/

相关文章:

android-ndk - Android NDK、CMake 与其他库

android - 将 "Tweet"按钮添加到 Android 的 C++ 应用程序的最佳方法是什么

android - 基于 flavor 的gradle依赖版本

android - 在 android 布局中的微调器旁边添加和图像

android - 为 API 请求动态添加可选参数

android - BroadcastReceiver 未收到 BOOT_COMPLETED 通知

android - 在包含 BUILD_SHARED_LIBRARY 之前缺少 LOCAL_MODULE

android spotify 错误分离线程与 interp 帧(计数 = 28)

安卓工作室。导入后未指定模块

android - Android NDK 中的链接器错误(对 `__cxa_end_cleanup' 的 undefined reference )