这似乎是Android的一个流行问题:我有一个预编译的.so文件,我想通过JNI访问,但我不能让Android Studio(在我的情况下为1.5版)以某种方式构建项目这使得这个文件可以访问。就像其他人提出这个问题一样,我在调用System.loadLibrary()时遇到了UnsatisfiedLinkError:
static {
System.loadLibrary("NativeLib");
}
在StackOverflow上有几个像这样的问题,解决方案似乎集中在两种技术上,这两种技术都不适用于我:
Creating a main/jniLibs directory:有人说,如果您创建一个名为/app/src/main/jniLibs
的文件夹,并在其中包含目标文件夹(我尝试了所有armeabi
,{{1} }和armeabi-v7
),Android Studio将找到该库。另请参阅This question.如果我这样做,我的java代码中的本机调用仍然以红色突出显示工具提示文本,“无法解析相应的JNI函数Java_my_function_etc”。工具提示引用与我使用javah实用程序生成的方法调用相同。
Modifying build.gradle另一个建议的解决方案是通过修改build.gradle来指向.so文件的位置。就我而言,我尝试将jniLibs.srcDirs设置为arm64-v8a
和'jniLibs',而有问题的.so文件位于/src/main/jniLibs
,/app/src/main/jniLibs/armeabi
和/app/src/main/jniLibs/armeabi-v7a
。我的gradle文件:
/app/src/main/jniLibs/arm64-v8a
2013年Google Groups发布的第三种技术似乎是将.so文件打包到jar中,并在项目中包含jar文件。我解压缩了我的APK文件,发现.so文件包含在apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.my.application"
minSdkVersion 21
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets {
main {
jniLibs.srcDirs = ['jniLibs']
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile files('libs/commons-lang3-3.1.jar')
}
,./lib/armeabi
和./lib/armeabli-v7a
中。我没有尝试这种技术,因为它似乎过时了,因为我的.so文件正在进入APK,所以不必要。
我没有尝试的事情。是否还有其他技术可以在Android Studio项目中包含原生.so?在上述两种技巧中,我有什么可以忽略的吗?自链接问题得到解答后,Android Studio是否以某种关键方式发生了变化?