应用程序二进制接口(Application Binary Interface)定义了二进制文件(尤其是.so文件)如何运行在相应的系统平台上,从使用的指令集,内存对齐到可用的系统函数库。在Android 系统上,每一个CPU架构对应一个ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64。
jar包存放到工程的libs目录下。
在main下建个文件叫jniLibs
android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.zsk.ndkexample" minSdkVersion 17 targetSdkVersion 26 versionCode 1 versionName "1.0" multiDexEnabled true //突破应用方法数65535的一个限制 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true // 不声明ndk标签,项目默认会创建一个libapp.so的文件 ndk { // 声明创建so库的文件名,会自动添加lib前缀, 添加了前缀,不会自动添加 moduleName "MathKit" //声明启用Android日志, 在c/c++的源文件中使用的#include <android/log.h> 日志将得到输出 ldLibs "log" // 声明创建指定cpu架构的so库, 不声明的话, 默认(gradle 1.5.0)会生成4中架构 多一种mips架构 // 具体cpu架构的区别请参考: // for detailed abiFilter descriptions, refer to "Supported ABIs" @ // https://developer.android.com/ndk/guides/abis.html#sa //如果想在模拟器运行 加上 "x86" abiFilters "armeabi-v7a" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } sourceSets.main { jniLibs.srcDirs 'src/main/jniLibs' } //sourceSets { // main { // 1. 配置在根目录libs下可以加载第三方so库, (最好不要创建jniLibs, 在众多的开源库中可能会引起冲突,还没发现) // 2. 运行时会自动将libs目录下的so库拷贝到指定目录 // 3. 如果自己创建的so不需要重新编译,可以将(app/build/intermediates/transforms)生成的so拷贝到这个目录 // jniLibs.srcDirs = ['libs'] // 如果是单个文件夹 可以直接这样如下配置 // jniLibs.srcDir 'libs' // } }}
此外,要再 gradle.properties 文件中添加android.useDeprecatedNdk=true,重新编译工程即可。
不同CPU架构的Android手机加载时会在libs下找自己对应的目录,从对应的目录下寻找需要的.so文件;如果没有对应的目录,就会去armeabi下去寻找,如果已经有对应的目录,但是如果没有找到对应的.so文件,也不会去armeabi下去寻找了。 所以,这里需要注意工程配置哪几个so文件目录,需要加载对应的so文件,不然会报错。
如何适配各个目录,例如有一些第三方的类库只提供了armeabi下的.so文件,而工程配置不止armeabi一个目录,这就需要将armeabi下的.so文件复制到其他对应的目录下。果第三方提供了不同平台的.so文件,则复制不同平台的.so文件到项目中对应的文件夹下即可。
so文件也会影响编译出的apk大小(将apk解压出来,lib目录下就为so文件目录),所以只配置armeabi一个目录,既能适配各CPU架构的手机,也能精简apk大小(微信就是只有armeabi一个目录)。
总结
以上所述是小编给大家介绍的Android Studio工程引用第三方so文件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!
ThinkCMF第三方类库在simplewind/Core/Library/Vendor 如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的vendor函数简化导入。例如,我们来导入二维码操作库phpqrcode,把 phpqrcode放到Vendor目录下面,这个时候phpqrcode主文件的路径就是 simplewind/
本文向大家介绍Clion(CMake工具)中引入第三方库的详细方法,包括了Clion(CMake工具)中引入第三方库的详细方法的使用技巧和注意事项,需要的朋友参考一下 前言 因为自己最近在学Redis,想要在C++中获取到Redis内存数据库中的数据,需要使用Redis客户端来连接Redis传输命令并接收数据,在Redis官方网站上推荐的客户端中选择了acl-redis。而Clion是一款非常优秀
一直以来不会使用C++一直是我心头痛,不过学习Go从某种意义上补偿了我这个遗憾。 比如生成dll一直以来几乎就是C和C++的专利,现在我可以用Go轻松的实现这一点。 下面我使用一个实例来做到这一点,这个是我写的判断jpeg图是不是正向的一个Go的函数 package main import "C" import ( "fmt" "os" SunnyUtil "githu
These are 3rd party tools and utilities created by the community and we do not provide any support or warranties for the solutions listed below Python API 封装 (by corpetty) https://github.com/corpetty/
OpenResty 引用第三方 resty 库非常简单,只需要将相应的文件拷贝到 resty 目录下即可。 我们以 resty.http ( pintsized/lua-resty-http) 库为例。 只要将 lua-resty-http/lib/resty/ 目录下的 http.lua 和 http_headers.lua 两个文件拷贝到 /usr/local/openresty/lualib
本文向大家介绍Angular5中调用第三方js插件的方法,包括了Angular5中调用第三方js插件的方法的使用技巧和注意事项,需要的朋友参考一下 话不多说直入主题,最常见的有三种方式来引用第三方插件,下面以jquery插件及基于JQuery的两款插件:nicescroll和rangeSlider为例。 一、第一种方式:在.angular-cli.json文件中配置 步骤: 1.在项目根目录.an