Android Studio - 包含和使用.so库

use*_*922 4 java android gradle android-studio

我需要在我的android项目中使用一些本机库(.so).根据StackOverflow中关于这个主题的一些答案,我创建了一个jniLibs文件夹app/src/main并放在那里我的文件:

armeabi/my_lib.so
armeabi-v7a/my_lib.so
x86/my_lib.so
Run Code Online (Sandbox Code Playgroud)

然后,在我的活动类中,我使用:

static {
        System.loadLibrary("my_lib");
    }
Run Code Online (Sandbox Code Playgroud)

但是当我运行应用程序时,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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*922 5

谢谢你们的帮助,但这是一个愚蠢的问题。当我将.so文件导入到 下时jniLibs,它们的名称类似于libSONAME.so. 在这些代码行中:

static {
    System.loadLibrary("libSONAME");
}
Run Code Online (Sandbox Code Playgroud)

我们不应该使用System.loadLibrary("libSONAME");,而只是System.loadLibrary("SONAME");

然后,构建项目,一切就OK了。

谢谢大家的帮助。我希望这会为其他人节省时间。


Gui*_*gis 5

解决方案1

在"src/main /"中创建文件夹"jniLibs"将所有.so库放在"src/main/jniLibs"文件夹中文件夹结构如下所示:

|--app: 
|--|--src: 
|--|--|--main 
|--|--|--|--jniLibs 
|--|--|--|--|--armeabi 
|--|--|--|--|--|--.so Files 
Run Code Online (Sandbox Code Playgroud)

你能否确认你有这种等级?

没有额外的代码只需同步您的项目并运行您的应用程序.

参考 https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main

解决方案2

将模块gradle.build文件中的两个代码段添加为依赖项:

compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
Run Code Online (Sandbox Code Playgroud)

如何创建这个自定义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)
}
Run Code Online (Sandbox Code Playgroud)

资源