如何在Android Studio中包含* .so库?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android Studio中包含* .so库?相关的知识,希望对你有一定的参考价值。

我阅读了许多线程如何将* .so库添加到android Studio,但它们都不起作用,特别是当涉及到文本点时:这不适用于较新的xxx(Android Studio,gradle,...)

我们能否重新开始吧。我有:

Android Studio 0.6.0

从项目结构我看到:

SDK位置:

/usr/share/android-studio/data/sdk
/usr/lib/jvm/default-java

项目:

Gradle version 1.10
Android Plugin Version 0.11.+

模块/应用程序:属性:

编译Sdk版本19构建工具版本19.1.0

依赖关系:

{dir=libs, include=[*.jar]} Compile

{dir=libs, include=[*.so]}  Provided

m com.android.support: appcompat -v7:19.+   Compile

我得到了预先编译的* .so文件,并且在演示应用程序中它们正在运行。我必须更改应用程序的源代码,因此我需要使用相同的* .so文件进行重建。

答案

现行解决方案

创建文件夹project/app/src/main/jniLibs,然后将您的*.so文件放在该位置的abi文件夹中。例如。,

project/
├──libs/
|  └── *.jar       <-- if your library has jar files, they go here
├──src/
   └── main/
       ├── AndroidManifest.xml
       ├── java/
       └── jniLibs/ 
           ├── arm64-v8a/                       <-- ARM 64bit
           │   └── yourlib.so
           ├── armeabi-v7a/                     <-- ARM 32bit
           │   └── yourlib.so
           └── x86/                             <-- Intel 32bit
               └── yourlib.so

不推荐的解决方案

将模块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(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}

在相关问题中也可以找到相同的答案:Include .so library in apk in android studio

另一答案

在Android Studio 1.0.2中添加.so库

  1. 在“src / main /”中创建文件夹“jniLibs”
  2. 将所有.so库放在“src / main / jniLibs”文件夹中
  3. 文件夹结构看起来像, | --app: | - | --src: | - | - | - 主 | - | - | - | --jniLibs | - | - | - | - | --armeabi | - | - | - | - | - | - 。so文件 | - | - | - | - | --x86 | - | - | - | - | - | - 。so文件
  4. 没有额外的代码只需同步您的项目并运行您的应用程序。 参考 https://github.com/commonsguy/sqlcipher-gradle/tree/master/src/main
另一答案

* .so Studio中的库

您必须在android Studio项目中的main中生成jniLibs文件夹,并将所有.so文件放入其中。您还可以在build.gradle中集成此行

编译fileTree(dir:'libs',包括:['。jar','。so'])

这很完美

| --app:

| - | --src:

| - | - | - 主

| - | - | - | --jniLibs

| - | - | - | - | --armeabi

| - | - | - | - | - | - 。so文件

这是项目结构。

另一答案

解决方案1:创建JniLibs文件夹

在您的应用程序中创建一个名为“jniLibs”的文件夹,并在里面包含您的* .so文件夹。需要在与“Java”或“Assets”文件夹相同的文件夹中创建“jniLibs”文件夹。

解决方案2:修改build.gradle文件

如果您不想创建新文件夹并将* .so文件保存到libs文件夹中,则可以!

在这种情况下,只需将您的* .so文件添加到libs文件夹中(请尊重与解决方案1相同的体系结构:例如libs / armeabi / .so)并修改应用程序的build.gradle文件以添加源目录的jniLibs。

sourceSets {
    main {
        jniLibs.srcDirs = ["libs"]
    }
}

您将获得更多解释,屏幕截图可以帮助您(步骤6):

http://blog.guillaumeagis.eu/setup-andengine-with-android-studio/

编辑它必须是jniLibs.srcDirs,而不是jni.srcDirs - 编辑代码。该目录可以是指向项目目录外部的[相对]路径。

另一答案

这是我的build.gradle文件,请注意该行

jniLibs.srcDirs = ['libs']

这将包括libs的* .so文件到apk。

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }

    // Move the tests to tests/java, tests/res, etc...
    instrumentTest.setRoot('tests')

    // Move the build types to build-types/<type>
    // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
    // This moves them out of them default location under src/<type>/... which would
    // conflict with src/ being used by the main source set.
    // Adding new build types or product flavors should be accompanied
    // by a similar customization.
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')
}
另一答案

Android NDK官方hello-libs CMake示例

https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs

刚刚在Ubuntu 17.10主机,Android Studio 3,Android SDK 26上为我工作,所以我强烈建议您将项目基于它。

共享库名为libgperf,关键代码部分是:

  • hello-libs/app/src/main/cpp/CMakeLists.txt// -L add_library(lib_gperf SHARED IMPORTED) set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION ${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so) // -I target_include_directories(hello-libs PRIVATE ${distribution_DIR}/gperf/include) // -lgperf target_link_libraries(hello-libs lib_gperf)
  • app/build.gradleandroid { sourceSets { main { // let gradle pack the shared library into apk jniLibs.srcDirs = ['../distribution/gperf/lib'] 然后,如果你在设备上查看/data/applibgperf.so也会在那里。
  • 在C ++代码上,使用:#include <gperf.h>
  • 标题位置:hello-libs/distribution/gperf/include/gperf.h
  • lib位置:distribution/gperf/lib/arm64-v8a/libgperf.so
  • 如果您只支持某些体系结构,请参阅:Gradle Build NDK target only ARM

示例git跟踪预构建的共享库,但它也包含实际构建它们的构建系统:https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs

另一答案

使用本机库(so文件)您需要在“build.gradle”文件中添加一些代码。

此代码用于清理“armeabi”目录,并在“清理项目”时将“so”文件复制到“armeabi”中。

task copyJniLibs(type: Copy) {
    from 'libs/armeabi'
    into 'src/main/jniLibs/armeabi'
}
tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(copyJniLibs)
}
clean.dependsOn 'cleanCopyJniLibs'

我从下面提到过。 https://gist.github.com/pocmo/6461138

另一答案

我已经使用打包在jar文件中的外部本机lib依赖项解决了类似的问题。有时这些体系结构依赖库一起打包在一个jar中,有时它们被分成几个jar文件。所以我写了一些buildscript来扫描本机库的jar依赖项,并将它们排序到正确的android lib文件夹中。此外,这还提供了一种下载maven repos中没有的依赖关系的方法,这种方法目前可用于让JNA在android上运行,因为并非所有本机jar都在public maven repos中发布。

android {
    compileSdkVersion 23
    buildToolsVersion '24.0.0'

    lintOptions {
        abortOnError false
    }


    defaultConfig {
        applicationId "myappid"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ["src/main/jniLibs", "$buildDir/native-libs"]
        }
    }
}

def urlFile = { url, name ->
    File file = new File("$buildD

以上是关于如何在Android Studio中包含* .so库?的主要内容,如果未能解决你的问题,请参考以下文章

在android studio的apk中包含.so库[重复]

Android Studio中包含* .so库的错误

如何在 android studio 中包含应用内图标选择器?

如何在android studio项目中包含共享库?

关于android studio so文件 冲突 怎么解决

[在Android Studio中,构建一个Android Wear项目,如何在两个模块中包含相同的文件