1、Cmake引用第3方库opencv,报错:
error: undefined reference to 'cv::CascadeClassifier::detectMultiScale(cv::_InputArray const&, std::__ndk1::vector, std::__ndk1::allocator> >&, double, int, int, cv::Size_, cv::Size_)'
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
其中原因是bulid.grade中的cmake编译选项不对:
externalNativeBuild {
cmake {
arguments'-DANDROID_PLATFORM=android-19',
'-DANDROID_TOOLCHAIN=clang','-DANDROID_STL=c++_shared','-DCMAKE_BUILD_TYPE=Release ..'
cppFlags"-std=c++11 -frtti -O3 -fexceptions"
}
}
-DANDROID_STL=c++_shared应该改为-DANDROID_STL=gnustl_static
方法:
(1)在jni目录下新建Application.mk; 加入 APP_STL := stlport_static 右边的值还可以换成下面几个:
system- 使用默认最小的C++运行库,这样生成的应用体积小,内存占用小,但部分功能将无法支持
stlport_static- 使用STLport作为静态库,这项是Android开发网极力推荐的
stlport_shared- STLport 作为动态库,这个可能产生兼容性和部分低版本的Android固件,目前不推荐使用。
gnustl_static- 使用 GNU libstdc++ 作为静态库
默认情况下STLPORT是不支持C++异常处理和RTTI,所以不要出现 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static来支持标准C++的特性,但生成的文件体积会偏大,运行效率会低一些。
支持C++异常处理,在Application.mk中加入 LOCAL_CPPFLAGS += -fexceptions这句,同理支持RTTI,则加入LOCAL_CPPFLAGS += -frtti,这里再次提醒大家,第二条说的使用gnustl静态库,而不是stlport。
强制重新编译 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以强制重新编译STLPort源码,由于一些原因可能自己需要修改下STLPort库,一般普通的开发者无需使用此项
(2) 在要使用STL的cpp文件中包含相关的头文件,并且使用using namespace std;
2、More than one file was found with OS independent path 'lib/armeabi-v7a/libFace.so'
这是由于将输出的libFace.so导入了指定的输出目录后导致的,可以在build.gradle下添加:
packagingOptions {
pickFirst'lib/armeabi-v7a/libFace.so'
}
3、Android NDK相关说明