如何在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库
- 在“src / main /”里创build文件夹“jniLibs”
- 将所有.so库放在“src / main / jniLibs”文件夹中
- 文件夹结构看起来像,
| –app:
| – | –src:
| – | – | – 主
| – | – | – | –jniLibs
| – | – | – | – | –armeabi
| – | – | – | – | – | – 。so文件
| – | – | – | – | –x86
| – | – | – | – | – | – 。so文件 - 没有额外的代码只需要同步你的项目并运行你的应用程序。
参考
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'
我已经解决了一个类似的问题,使用外部原生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'])