将.so(预建)库从另一个目录添加到APK

时间:2018-06-06 06:51:25

标签: 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]]]找不到“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']
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

但是您将 abiFilters 设置为已被删除的armeabi。您应该将其设置为armeabi-v7a,并确保也为此ABI构建libtheprebuiltlib.so,或者您可以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 无法正常工作。

答案 1 :(得分:1)

对于NDK r16和Gradle插件v3.1.2,这是一步一步的解决方案(感谢@Alex Cohn)。

  1. { "jobId": "0001", "outputMetadata": { "fileName_OK": "0001", "fileName_Fail_1": "some_text_#(jobId)", "fileName_Fail_2": "#(jobId)-and-some-more-text", "fileName_Fail_3": "prepend #(jobId) and append" } } 设置为指向外部.so

    的位置
    android.sourceSets.main.jniLibs.srcDir
  2. 确保您的外部.so位于上述路径(步骤1)中,并附加正确的体系结构。就我而言,它是android { sourceSets { main { jniLibs.srcDir 'C:/svn/sys_libs' } } } ,因此我的.so就在

    armeabi
  3. C:/svn/sys_libs/armeabi/libtheprebuiltlib.so ndk移至android.defaultConfig.externalNativeBuild.ndk,如此

    android.defaultConfig.ndk
  4. 确保CMakeLists.txt指向具有适当架构的完整路径。

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