我需要在我的android项目中使用一些本机库(.so)。根据StackOverflow中关于此主题的一些答案,我在jniLibs
中创建了一个app/src/main
文件夹,并将文件放在那里:
armeabi/my_lib.so
armeabi-v7a/my_lib.so
x86/my_lib.so
然后,在我的活动课中,我使用:
static {
System.loadLibrary("my_lib");
}
但是当我运行应用程序时,会生成UnsatisfiedLinkError
异常。如果重要的是要注意,我没有Android.mk文件,我在gradle
文件中没有改变任何与此有关的内容。所以,我唯一想到的就是在.so
中复制粘贴我的jniLibs
文件,并在我的活动中编写上面的代码。那么这个问题可能是什么原因呢?我错过了什么吗?
修改
这是我的傻瓜:
apply plugin: 'com.android.application'
android {
compileSdkVersion 15
buildToolsVersion "23.0.3"
compileOptions.encoding = 'ISO-8859-1'
defaultConfig {
applicationId "my.package"
minSdkVersion 4
targetSdkVersion 4
ndk {
moduleName "my_so_lib"
}
}
sourceSets {
main {
jni.srcDirs = ["libs"]
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
debuggable true
}
}
splits {
abi {
enable true
reset()
include 'x86', 'armeabi-v7a', 'mips', 'armeabi'
universalApk false
}
}
}
答案 0 :(得分:5)
解决方案1
创建文件夹" jniLibs"在里面" src / main /" 将所有.so库放在" src / main / jniLibs"夹 文件夹结构如下:
|--app:
|--|--src:
|--|--|--main
|--|--|--|--jniLibs
|--|--|--|--|--armeabi
|--|--|--|--|--|--.so Files
你能否确认你有这种等级?
没有额外的代码只需同步您的项目并运行您的应用程序。
参考 https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main
解决方案2
将模块gradle.build文件中的两个代码段添加为依赖项:
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
如何创建此自定义jar:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
答案 1 :(得分:4)
谢谢你们的帮助,但这是一个愚蠢的问题。当我在.so
下导入jniLibs
个文件时,它们被命名为libSONAME.so
。在这些代码行中:
static {
System.loadLibrary("libSONAME");
}
我们不应该使用System.loadLibrary("libSONAME");
,而只使用System.loadLibrary("SONAME");
。
然后,只需构建项目,一切正常。
谢谢大家的帮助。我希望这会为其他人节省时间。
答案 2 :(得分:1)
你的gradle版本是什么?如果您有0.7.3或更新的版本,那么下一篇文章应该可以帮助您: 点击here!