最近做项目,集成的算法需要编译成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. Activity 透明
  3. 插件化开发之坑位的理解(Hook)
  4. Android(安卓)-- 获取摄像头帧数据解码
  5. android使用web加载网页的js问题
  6. Android(安卓)studio编译时出现aapt.exe 崩溃的解决方法
  7. Android常用动画alpha和rotate同时使用
  8. 修改android版本号
  9. Android(安卓)之 WebView的使用介绍

随机推荐

  1. 【Android开发经验】兼容不同的屏幕大小(
  2. 在android中使用文件进行数据存储
  3. android用Intent传输自定对象数组(Parcel
  4. ActionBar使用
  5. Android圆形图片控件RoundedImageView
  6. GrideView简单使用
  7. android usb解析(一)UsbDeviceManager(and5
  8. android使用GestureDetector实现手势下滑
  9. Android(安卓)交叉编译 i2c-tools
  10. Android(安卓)如何避免(降低)后台程序被杀?