前提情况
1。 android studio 编译器
2。 利用ncnn前向推理框架进行移植caffemodel到android手机端
3。 使用cmake进行编译,NDK java的c++接口
出现问题
/ncnn/src/cpu.cpp:426: undefined reference to `stderr'(主要问题根源)
具体问题如下(为了大家能够看得清楚,这里我把背景调成白的了,平时都是黑的)
分析问题
首先出现问题的过程是因为我这边用的ncnn最后make build的平台是armeabi-v7a,为大多数android手机的硬件cpu结构,但是此处项目需要需要用到RK3399硬件,查之后得知cpu架构为arm64-v8a,所以需要更改一些文件(ncnn make-build时的libncnn.a文件和include文件夹,具体可参考ncnn使用),还需要更改一些路径CMakeList中的路径以及build-gradle文件中的平台名称如下图:
这样应该如愿以偿进行编译项目工程的时候就会Cmake成功得到libMobileNetssd.so文件
并且此文件在如下图位置,当然画红框的文件夹名称应该为此时的cpu框架arm64-v8a
好了!
现在已经分析好了,从前到尾整个过程,但是最后编译会出现以前error
可能的问题出在分析如下
- 路径没有改,文件没有改(这里我从前到尾好好走了一遍是都改好的,并且路径正确)
- 缺少某些低版本的文件,但是最后提示error没有显示,说明不缺文件
- SDK的版本问题
为啥会有最后一种思考呢?因为cmake的用法我已经很熟悉,深度学习框架caffe和前向推理ncnn的用法都不存在问题,所以唯一的问题就应该存在于sdk某些版本支持问题(android这方面很常见)
解决
https://stackoverflow.com/questions/51767214/android-studio-with-ndk-link-error-undefined-reference-to-stderr
看了这个回答,我把我的minSdkVersion改大了
改成这样
最终完美解决生成.so,整个项目也可以正常运行了
思考
我的想法是 因为这个cpu架构出的可能比较晚,或者说androd sdk高版本才支持所以,需要把最小的androidsdk版本调高即可