【问题标题】:Android Studio - include and consume .so libraryAndroid Studio - 包含和使用 .so 库
【发布时间】:2016-09-04 03:45:05
【问题描述】:

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

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
        }
    }
}

【问题讨论】:

    标签: java android android-studio gradle


    【解决方案1】:

    解决方案 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 文件中添加两个代码 sn-ps 作为依赖项:

    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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        【解决方案3】:

        你的 gradle 版本是什么?如果您有 0.7.3 或更新的版本,那么下一篇文章应该可以帮助您: 点击here

        【讨论】:

        • 你能补充一些解释吗?
        • 我的 gradle 版本是1.5.0。我按照链接的建议做了,但我收到了这个错误Error: NDK integration is deprecated in the current plugin.....。我还应该做些什么吗?
        猜你喜欢
        • 2023-03-17
        • 2016-08-02
        • 1970-01-01
        • 2013-05-17
        • 2016-02-10
        • 2016-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多