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

Ron*_*ger 109 android android-studio

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

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

Android Studio 0.6.0

从项目结构我看到:

SDK位置:

/usr/share/android-studio/data/sdk
/usr/lib/jvm/default-java
Run Code Online (Sandbox Code Playgroud)

项目:

Gradle version 1.10
Android Plugin Version 0.11.+
Run Code Online (Sandbox Code Playgroud)

模块/应用程序:属性:

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

依赖关系:

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

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

m com.android.support: appcompat -v7:19.+   Compile
Run Code Online (Sandbox Code Playgroud)

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

Vas*_*nth 209

在Android Studio 1.0.2中添加.so库

  1. 在"src/main /"中创建文件夹"jniLibs"
  2. 将所有.so库放在"src/main/jniLibs"文件夹中
  3. 文件夹结构如下所示,
    | - app:
    | - | --src:
    | - | - | --main
    | - | - | - | --jniLibs
    | - | - | - | - | --armeabi
    | - | - | - | - | - | -
    .so 文件 | - | - | - | - | - x86
    | - | - | - | - | - | - .so文件
  4. 没有额外的代码只需同步您的项目并运行您的应用程序.

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

  • 这是正确的答案,在Android Studio 1.2.2中工作.检查并验证. (6认同)
  • 这不适用于2015年6月16日的测试版Studio (5认同)
  • 使用Android Studio 1.3.1. (3认同)
  • 不适用于android studio 1.4.1 (3认同)
  • 为我工作thnx.在android studio 2.1.2 :) (3认同)
  • 与Android Studio 3.2.1兼容,很棒!仍然没有记录在任何地方! (2认同)
  • @NorbertM 在这里记录 https://developer.android.com/studio/projects/gradle-external-native-builds#jniLibs 七年后。;-O (2认同)

nen*_*ick 90

现行解决方案

创建该文件夹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
Run Code Online (Sandbox Code Playgroud)

不推荐的解决方案

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

相同的答案也可以在相关的问题中找到:在Android工作室的apk中包含.so库

  • `Compile`任务已被弃用.使用`JavaCompile`代替(来自相关答案) (6认同)
  • 请先尝试jniLibs文件夹解决方案.应将此任务放入app/library gradle.build文件中. (2认同)

Ram*_*ash 25

*.so Studio中的库

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

compile fileTree(dir: 'libs', include: ['.jar','.so'])

It's work perfectly

|--app:

|--|--src:

|--|--|--main

|--|--|--|--jniLibs

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

|--|--|--|--|--|--.so Files

This is the project structure.

  • 在**编译fileTree中添加**.所以**(dir:'libs',包括:['.jar','.so'])**解决了我的prb.日Thnx (3认同)

Gui*_*gis 21

解决方案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"]
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 12

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

jniLibs.srcDirs = ['libs']
Run Code Online (Sandbox Code Playgroud)

这将包括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')
}
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 5

Android NDK 官方hello-libsCMake 示例

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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 应用程序/build.gradle

    android {
        sourceSets {
            main {
                // let gradle pack the shared library into apk
                jniLibs.srcDirs = ['../distribution/gperf/lib']
    
    Run Code Online (Sandbox Code Playgroud)

    然后,如果您查看/data/app设备下方,libgperf.so也会在那里。

  • 在 C++ 代码上,使用: #include <gperf.h>

  • 标题位置: hello-libs/distribution/gperf/include/gperf.h

  • 库位置: 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