AS NDK编译问题

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

NDK编译

工作积累之NDK编译STL

方法:

(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相关说明

 Android C++库支持

你可能感兴趣的:(AS NDK编译问题)