我正在尝试从另一个目录中包含我的.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']
}
}
}
答案 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)。
将{
"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
确保您的外部.so位于上述路径(步骤1)中,并附加正确的体系结构。就我而言,它是android {
sourceSets {
main {
jniLibs.srcDir 'C:/svn/sys_libs'
}
}
}
,因此我的.so就在
armeabi
将C:/svn/sys_libs/armeabi/libtheprebuiltlib.so
从ndk
移至android.defaultConfig.externalNativeBuild.ndk
,如此
android.defaultConfig.ndk
确保CMakeLists.txt指向具有适当架构的完整路径。
android {
defaultConfig {
ndk {
abiFilters 'armeabi'
}
}
}