最近做项目,集成的算法需要编译成so库给客户使用,在编译过程中遇到一些问题,下面先说下我的配置:

apply plugin: 'com.android.library'android {    compileSdkVersion 27    defaultConfig {        minSdkVersion 23        targetSdkVersion 27        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"        ndk{            abiFilters 'armeabi-v7a','arm64-v8a','armeabi'        }        externalNativeBuild {            cmake {//                   cppFlags "-frtti -fexceptions"                cppFlags "-std=c++11 -frtti -fexceptions"//                arguments "-DANDROID_TOOLCHAIN=gcc"//                arguments "-DANDROID_ABI=arm64-v8a"//                arguments "-DANDROID_ABI=armeabi-v7a"//                arguments "-DCMAKE_BUILD_TYPE=Release"            }        }    }    buildTypes {        release {            minifyEnabled true            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }    externalNativeBuild {        cmake {            path "CMakeLists.txt"        }    }    sourceSets.main{    //设置opencv的native库路径,用于加载opencv_java3        jniLibs.srcDir '../OpenCV-android-sdk/sdk/native/libs'         jni.srcDirs = [] //disable automatic ndk-build call    }}dependencies {    implementation fileTree(include: ['*.jar'], dir: 'libs')    implementation 'com.android.support:appcompat-v7:27.1.1'    testImplementation 'junit:junit:4.12'    androidTestImplementation 'com.android.support.test:runner:1.0.2'    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'    implementation project(':openCVLibrary310')}

发现编译有时候会根据(有时候不会出现三个,只在armeabi-v7a下有

ndk{            abiFilters 'armeabi-v7a','arm64-v8a','armeabi'        }

而出现三个abiFilters 'armeabi-v7a','arm64-v8a','armeabi'目录下有so,然后拷贝到其他项目运用时候
32位的手机可以正常跑,但64位的总是报错:

dlopen failed: "/data/app/com.example.lammy.transferinterface-IO3lOUc-19oaBjCNmDxA-A==/lib/arm64/libtransfer.so" is 32-bit instead of 64-bit

报错原因很容易找到,加载arm64-v8a说是用32位的库代替了64位的,可是明明自己生的so库,后来将调用so库里加上:

ndk{            abiFilters 'armeabi-v7a'        }

让它只加载32位的,则64位和32位手机都可以跑了,但并没有完美解决,后面在编译库的moudle的gradle里添加

externalNativeBuild {            cmake {//                   cppFlags "-frtti -fexceptions"                cppFlags "-std=c++11 -frtti -fexceptions"//                arguments "-DANDROID_TOOLCHAIN=gcc"                  arguments "-DANDROID_ABI=arm64-v8a"//                arguments "-DANDROID_ABI=armeabi-v7a"//                arguments "-DCMAKE_BUILD_TYPE=Release"            }        }

代码,位置对应与上面的完整gradle来看,只需要打开注释。

cppFlags "-std=c++11 -frtti -fexceptions"表示是使用c++11来编译,这里是为了解决在编译c++文件时,一些参数,如错误:

 error: use of undeclared identifier 'nullptr' uchar* lut_ptr = nullptr;

arguments 则指明了编译的库的位数,这里使用arguments "-DANDROID_ABI=arm64-v8a"编译出来的so库,才是真的64位的,如果要编译32位的,则需要修改arguments "-DANDROID_ABI=armeabi-v7a"这样可以编译出不同的cpu的so库了。

更多相关文章

  1. android获取手机唯一识别号
  2. Android移动开发之【Android实战项目】渐变的TextView小漂亮代码
  3. android使用web加载网页的js问题
  4. SQlite与android 的数据交互 (android 项目心得三)
  5. 问题:在运行android的项目时出现的异常
  6. Android 手机防火防源码(DroidWall)
  7. Android 下载进度条, 自定义加载进度条,loading动画
  8. Android项目中如果json字符串中key-value顺序很重要,不要使用Andr
  9. Android Support Library 介绍~在项目总如何使用android支持库

随机推荐

  1. Layout开发小技巧(三)
  2. Android面试题——Activity
  3. Android 进度条功能实现
  4. Android 使用SVG
  5. Android(安卓)LottieAnimation使用---踩
  6. Android 学习日志 2 :创建虚拟机,运行第一
  7. Android反编译工具的使用-Android(安卓)K
  8. Android热补丁方案对比
  9. Android 中需要掌握的高级技巧
  10. [置顶] android四大组件之intent