問題集合:
1.std標准庫問題:
錯誤信息例如:no member named 'to_string' in namespace 'std'
NDK高版本對std標准庫的支持並不良好,導致,接入opencv后,會因為std庫的問題報錯;
解決方案:
1.使用低版本ndk 如ndk14
2.使用高版本NDK重新編譯opencv庫,方法見:https://www.cnblogs.com/qq2523984508/p/9912221.html
3.opencv3的版本一定無法使用高版本的ndk,可以選擇opencv4的版本庫,因為opencv4講std標准庫自己定義了cv庫,所以,可以使用opencv4來配合高版本的ndk,但中間可能對某些cpu架構無法得到支持,比如比較老舊的armeabi。應該說高版本ndk都放棄了比較老舊armeabi架構平台。
2.運行時加載so庫時報錯:java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found
需要使用 '-DANDROID_STL=c++_shared'來驚醒cmake編譯:
android { compileSdkVersion 28 defaultConfig { minSdkVersion 19 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true externalNativeBuild { cmake { arguments '-DANDROID_PLATFORM=android-28','-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_shared', '-DCMAKE_BUILD_TYPE=Release ..' // arguments '-DANDROID_PLATFORM=android-28','-DANDROID_TOOLCHAIN=clang','-DENABLE_CXX11=ON','-DCMAKE_BUILD_TYPE=Release ..' cppFlags "-std=c++14 -O3 -frtti -fexceptions" } } ndk { abiFilters 'armeabi-v7a','arm64-v8a' } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "CMakeLists.txt" } } dataBinding { enabled = true } compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 } buildToolsVersion = '28.0.3' sourceSets { main { jni.srcDirs = ['src/main/jniLibs/'] } } }
摘要來自:http://blog.sina.com.cn/s/blog_49b3ba190102z0i1.html
本文會持續更新。