Android Studio - 包含和使用.so库

6

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

armeabi/my_lib.so
armeabi-v7a/my_lib.so
x86/my_lib.so

然后,在我的Activity类中,我使用:

static {
        System.loadLibrary("my_lib");
    }

但是当我运行应用程序时,会生成一个UnsatisfiedLinkError异常。如果这很重要需要注意,我没有Android.mk文件,并且我没有更改与此有关的任何东西在我的gradle文件中。所以,我唯一做的事情就是将我的.so文件复制粘贴到jniLibs中,并在我的活动中编写上述代码。那么这个问题的原因可能是什么?我漏掉了什么吗?
编辑
这是我的gradle:
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
        }
    }
}
3个回答

7

解决方案1

在 "src/main/" 目录下创建名为 "jniLibs" 的文件夹 将所有 .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)
}

source


5
感谢大家的帮助,但这是一个愚蠢的问题。当我在“jniLibs”下导入我的“.so”文件时,它们的命名方式像“libSONAME.so”。在以下代码中:
static {
    System.loadLibrary("libSONAME");
}

我们不应该使用System.loadLibrary("libSONAME");,而是应该只使用System.loadLibrary("SONAME");
然后,只需构建项目,一切都将正常运行。
感谢大家的帮助。我希望这能为其他人节省时间。

1
你的gradle版本是什么?如果你有0.7.3或更新的版本,那么下一篇文章应该会有所帮助:点击这里

2
你能添加一些解释吗? - Saif
我的gradle版本是1.5.0。我按照链接建议的做法去做,但是出现了这个错误Error: NDK integration is deprecated in the current plugin.....。我需要再做些什么吗? - user19922

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接