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

我读了许multithreading,如何将一个* .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构build工具版本19.1.0

依赖关系:

 {dir=libs, include=[*.jar]} Compile {dir=libs, include=[*.so]} Provided m com.android.support: appcompat -v7:19.+ Compile 

我得到了* .so文件预编译,并在他们正在工作的演示应用程序。 我必须更改应用程序的源代码,所以我需要使用相同的* .so文件重build。

创build新文件夹project/app/src/main/jniLibs ,然后将你的*.so文件和他的abi文件夹放到这个位置。

弃用的解决scheme

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

 compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar') 

如何创build这个自定义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) } 

同样的答案也可以在相关的问题中find: 在android studio中包含.so库

在Android Studio 1.0.2中添加.so库

  1. 在“src / main /”里创build文件夹“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

Android Studio中的* .so库

你必须在android studio项目中的主要内部生成jniLibs文件夹,并把你所有的.so文件放在里面。 你也可以在build.gradle中整合这一行

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

这是完美的工作

| –app:

| – | –src:

| – | – | – 主

| – | – | – | –jniLibs

| – | – | – | – | –armeabi

| – | – | – | – | – | – 。so文件

这是项目结构。

解决scheme1:创build一个JniLibs文件夹

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

解决scheme2:修改build.gradle文件

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

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

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

你会有更多的解释,截图帮助你在这里(第6步):

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

这是我的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') } 

要使用本机库(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

我已经解决了一个类似的问题,使用外部原生lib依赖关系打包在jar文件里面。 有时候,这些架构的依赖库会一起打包到一个jar文件中,有时会被拆分成几个jar文件。 所以我写了一些buildscript来扫描原生库的jar依赖项,并将它们分类到正确的android lib文件夹中。 此外,这也提供了一种方法来下载依赖,在maven回购目录中找不到,这是目前有用的JNA在Android上工作,因为不是所有的本地jar子在公共maven回购发布。

 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("$buildDir/download/${name}.jar") file.parentFile.mkdirs() if (!file.exists()) { new URL(url).withInputStream { downloadStream -> file.withOutputStream { fileOut -> fileOut << downloadStream } } } files(file.absolutePath) } dependencies { testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'net.java.dev.jna:jna:4.2.0' compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-arm.jar?raw=true', 'jna-android-arm') compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-armv7.jar?raw=true', 'jna-android-armv7') compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-aarch64.jar?raw=true', 'jna-android-aarch64') compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-x86.jar?raw=true', 'jna-android-x86') compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-x86-64.jar?raw=true', 'jna-android-x86_64') compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-mips.jar?raw=true', 'jna-android-mips') compile urlFile('https://github.com/java-native-access/jna/blob/4.2.2/lib/native/android-mips64.jar?raw=true', 'jna-android-mips64') } def safeCopy = { src, dst -> File fdst = new File(dst) fdst.parentFile.mkdirs() fdst.bytes = new File(src).bytes } def archFromName = { name -> switch (name) { case ~/.*android-(x86-64|x86_64|amd64).*/: return "x86_64" case ~/.*android-(i386|i686|x86).*/: return "x86" case ~/.*android-(arm64|aarch64).*/: return "arm64-v8a" case ~/.*android-(armhf|armv7|arm-v7|armeabi-v7).*/: return "armeabi-v7a" case ~/.*android-(arm).*/: return "armeabi" case ~/.*android-(mips).*/: return "mips" case ~/.*android-(mips64).*/: return "mips64" default: return null } } task extractNatives << { project.configurations.compile.each { dep -> println "Scanning ${dep.name} for native libs" if (!dep.name.endsWith(".jar")) return zipTree(dep).visit { zDetail -> if (!zDetail.name.endsWith(".so")) return print "\tFound ${zDetail.name}" String arch = archFromName(zDetail.toString()) if(arch != null){ println " -> $arch" safeCopy(zDetail.file.absolutePath, "$buildDir/native-libs/$arch/${zDetail.file.name}") } else { println " -> No valid arch" } } } } preBuild.dependsOn(['extractNatives'])