opencv jni Android 实例笔记

x33g5p2x  于2022-03-03 转载在 Android  
字(2.3k)|赞(0)|评价(0)|浏览(576)

看起来不错,c++调用的:

opencv4版本,本机 NDKTest-master.zip

GitHub - zyongLiu/NDKTest: android JNI Test,use OpenCV default

ncnn opencv3 enet融合例子:

https://github.com/watersink/enet-as-linux

java_opencv4.so方式,还有.a方式调用,

迁移到自己的项目不成功

OpenCVDemo/app/src/main/libs/arm64-v8a at main · GenialSir/OpenCVDemo · GitHub

这个项目548m,sdk的方式提供

GitHub - sohyeong-dev/OpenCV-JNI-Example: OpenCV JNI Example

项目中有ncnn,加opencv编译报错了

NDK工程使用ncnn vulkan包提示需要frtti、fexceptions

这两天弄一个工程,是在安卓端部署ncnn with vulkan的项目

一般来说都会用到 try catch 或者 有些库需要用到typeid

一般的方法是在build.gradle里面加上

      externalNativeBuild {
            cmake {
                cppFlags '-std=c++11 -frtti -fexceptions'
                abiFilters "armeabi-v7a", "arm64-v8a"
            }
        }

这个网上很多我就不具体说了,但是我发现我的工程即使加了这个也还是用不了,一开始以为是自己的设置啥的有问题,后来发现只要cmake里加了ncnn就会出这个问题,因此我就认真的读了ncnn里的cmake文件一般路径为:

ncnn-xxxxxx-android-vulkan\arm64-v8a\lib\cmake\ncnn\ncnn.cmake
于是在大概57行的位置我发现了这个:

set_target_properties(ncnn PROPERTIES
  INTERFACE_COMPILE_OPTIONS "-fno-rtti;-fno-exceptions"
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/ncnn"
  INTERFACE_LINK_LIBRARIES "-fopenmp;-static-openmp;Threads::Threads;Vulkan::Vulkan;\$<LINK_ONLY:glslang>;\$<LINK_ONLY:SPIRV>;android;jnigraphics;log"
  INTERFACE_POSITION_INDEPENDENT_CODE "ON"
)

好的罪魁祸首就是他了,只要把-fno-rtti;-fno-exceptions 改成 -frtti;-fexceptions就可以了。

不过我得声明一下我也是个小白哈,具体这么改了之后对ncnn的运行性能有什么影响我没有测,如果有大佬知道更好的解决办法希望能告诉我一下,我实在是没有别的办法了

原文链接:https://blog.csdn.net/fiendwbc/article/details/118976134

这个改完之后,ncnn报错了:

CMakeFiles/yolov5ncnn.dir/yolov5ncnn_jni.cpp.o:yolov5ncnn_jni.cpp:typeinfo for YoloV5Focus: error: undefined reference to 'typeinfo for ncnn::Layer'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
 

无效方法:

六、修改app/build.gradle下, defaultConfig里面加入下面的代码

externalNativeBuild {
**    **cmake {
**        **arguments "-DANDROID_TOOLCHAIN=clang"
        cFlags "-fopenmp -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math "
        cppFlags "-fopenmp -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math "
        arguments "-DANDROID_STL=c++_shared", "-DANDROID_CPP_FEATURES=rtti exceptions"
        cppFlags ""
        cppFlags "-std=c++14"
        cppFlags "-frtti"
        cppFlags "-fexceptions"
    }
}

相关文章