Article / 文章中心

NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )(二)

发布时间:2022-01-28 点击数:589
简介: 【错误记录】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理方案 ( 主应用与依赖库 Module 的 CPU 架构配置不匹配导致 )(二)

三、解决方案


解决方案 : 全部配置 armeabi-v7a 架构 , 这样在所有的手机中只存在 armeabi-v7a 架构 的动态库 , 系统查找时 , 就不会查找


android / defaultConfig / externalNativeBuild / cmake / abiFilters 配置 abiFilters 'armeabi-v7a' 即可 ; plugins {  id 'com.android.application'  id 'kotlin-android' } android {  compileSdkVersion 29  buildToolsVersion "30.0.2"  defaultConfig {  applicationId "kim.hsl.myapplication"  minSdkVersion 18  targetSdkVersion 29  versionCode 1  versionName "1.0"  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"  externalNativeBuild {  cmake {  cppFlags ""  abiFilters 'armeabi-v7a'  }  }  }  buildTypes {  release {  minifyEnabled false  proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  }  }  externalNativeBuild {  cmake {  path "src/main/cpp/CMakeLists.txt"  version "3.10.2"  }  }  compileOptions {  sourceCompatibility JavaVersion.VERSION_1_8  targetCompatibility JavaVersion.VERSION_1_8  }  kotlinOptions {  jvmTarget = '1.8'  } } dependencies {  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"  implementation 'androidx.core:core-ktx:1.3.2'  implementation 'androidx.appcompat:appcompat:1.2.0'  implementation 'com.google.android.material:material:1.2.1'  implementation 'androidx.constraintlayout:constraintlayout:2.0.4'  testImplementation 'junit:junit:4.+'  androidTestImplementation 'androidx.test.ext:junit:1.1.2'  androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }


主应用中生成的 动态库 , 只剩成了 armeabi-v7a 架构的动态库 ;

image.png



依赖库中还是生成的 armeabi-v7a 架构的动态库 ;

image.png


问题解决 ;


如果非要配置 arm64-v8a 架构 , 但是一旦配置上 , 所有的在 NDK 中使用到的依赖库 如 OpenSSL , FFMPEG , RTMP , FAAC , OpenCV 等 , 都必须一式两份 , 一份 armeabi-v7a 架构的静态/动态 依赖库 , 一份 arm64-v8a 架构的 静态 / 动态 依赖库 ; ( 很麻烦 , APK 编译后也很大 , 不推荐 )

简介: 【错误记载】NDK 报错 java.lang.UnsatisfiedLinkError 的一种处理计划 ( 主使用与依靠库 Module 的 CPU 架构装备不匹配导致 )(二)

三、解决计划


解决计划 : 悉数装备 armeabi-v7a 架构 , 这样在一切的手机中只存在 armeabi-v7a 架构 的动态库 , 体系查找时 , 就不会查找


android / defaultConfig / externalNativeBuild / cmake / abiFilters 装备 abiFilters 'armeabi-v7a' 即可 ; plugins {  id 'com.android.application'  id 'kotlin-android' } android {  compileSdkVersion 29  buildToolsVersion "30.0.2"  defaultConfig {  applicationId "kim.hsl.myapplication"  minSdkVersion 18  targetSdkVersion 29  versionCode 1  versionName "1.0"  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"  externalNativeBuild {  cmake {  cppFlags ""  abiFilters 'armeabi-v7a'  }  }  }  buildTypes {  release {  minifyEnabled false  proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  }  }  externalNativeBuild {  cmake {  path "src/main/cpp/CMakeLists.txt"  version "3.10.2"  }  }  compileOptions {  sourceCompatibility JavaVersion.VERSION_1_8  targetCompatibility JavaVersion.VERSION_1_8  }  kotlinOptions {  jvmTarget = '1.8'  } } dependencies {  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"  implementation 'androidx.core:core-ktx:1.3.2'  implementation 'androidx.appcompat:appcompat:1.2.0'  implementation 'com.google.android.material:material:1.2.1'  implementation 'androidx.constraintlayout:constraintlayout:2.0.4'  testImplementation 'junit:junit:4.+'  androidTestImplementation 'androidx.test.ext:junit:1.1.2'  androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' }


主使用中生成的 动态库 , 只剩成了 armeabi-v7a 架构的动态库 ;

image.png



依靠库中还是生成的 armeabi-v7a 架构的动态库 ;

image.png


问题解决 ;


如果非要装备 arm64-v8a 架构 , 可是一旦装备上 , 一切的在 NDK 中使用到的依靠库 如 OpenSSL , FFMPEG , RTMP , FAAC , OpenCV 等 , 都必须一式两份 , 一份 armeabi-v7a 架构的静态/动态 依靠库 , 一份 arm64-v8a 架构的 静态 / 动态 依靠库 ; ( 很麻烦 , APK 编译后也很大 , 不推荐 )