Android的JNI开发,使用两个基于ncnn的本地库时,运行出现 Fatal signal 6 (SIGABRT)错误
DolbyYu opened this issue · 40 comments
JNI接口使用两个本地lib,分别编译成动态库mtcnn.so和mfnet.so。两个动态库都基于ncnn,且都链接了libncnn.a的静态库。
运行时,mtcnn功能正常,运行到mfnet时报错。尝试不加载mtcnn时(或者注释掉所有mtcnn的.load_param()方法),mfnet可以跑通,不报错。
另外我发现这并不一定时mfnet的问题,当我把mfnet的所有代码替换为mtcnn时(即mfnet.so和mtcnn.so相同),同样在运行第二个本地库时报错,且错误相同?
请问大神该如何解决?
AS的Logcat报错信息如下:
2017-08-05 19:25:41.912 20274-20274/com.example.dms A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 20274 (com.example.dms), pid 20274 (com.example.dms)
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: Build fingerprint: 'rockchip/rk3399pro/rk3399pro:8.1.0/OPM8.190305.001/101257:userdebug/test-keys'
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: Revision: '0'
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: ABI: 'arm64'
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: pid: 20274, tid: 20274, name: com.example.dms >>> com.example.dms <<<
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x0 0000000000000000 x1 0000000000004f32 x2 0000000000000006 x3 0000000000000008
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x4 0000007999fd6000 x5 0000007999fd6000 x6 0000007999fd6000 x7 00000000001c7ea0
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x8 0000000000000083 x9 0000000010000000 x10 0000007ff69ab5e0 x11 0000000000000001
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x12 0000000000000018 x13 00000003e8000000 x14 00364add5e425850 x15 00000f704fc4ba2b
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x16 00000059ddea0fa8 x17 000000799688752c x18 00000078fc6e5400 x19 0000000000004f32
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x20 0000000000004f32 x21 0000000000000083 x22 00000078fd3f0cea x23 00000079154e11d6
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x24 00000078fd3f0cee x25 00000078fd43a000 x26 000000791558964c x27 0000007ff69ab970
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: x28 000000799a13fa40 x29 0000007ff69ab620 x30 000000799683c760
2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: sp 0000007ff69ab5e0 pc 000000799683c788 pstate 0000000060000000
2017-08-05 19:25:41.999 20339-20339/? A/DEBUG: backtrace:
2017-08-05 19:25:41.999 20339-20339/? A/DEBUG: #00 pc 000000000001d788 /system/lib64/libc.so (abort+120)
2017-08-05 19:25:41.999 20339-20339/? A/DEBUG: #1 pc 000000000015e498 /data/app/com.example.dms-hnU3L7aK-rU0IqLRnkVVkg==/lib/arm64/libmfnet.so (__kmp_abort_process+44)
不合并的话试试 strip 两个你的 so,看看能否解决。
请问有没有解决呢?我也遇到类似问题,尝试了自己编译ncnn库,感觉是和openmp有关
请问有没有解决呢?我也遇到类似问题,尝试了自己编译ncnn库,感觉是和openmp有关
我把mtcnn、mfnet和ncnn编译成一个动态库后解决了,具体什么原因还不知道
遇到了同样的问题@_@
同样问题,有什么优雅的解决方案吗?
同样问题,有什么优雅的解决方案吗?
必须分so的话,就不要用.a了,编译一个libncnn.so共用来解决相对优雅一点
你好,请问后面有其他解决方法吗,我被这个bug缠了好几天
可以参考 android/ndk#1028 的建议,修改 ld flags
老的ndk上尝试
-Wl,-Bstatic -lomp -Wl,-Bdynamic
新的ndk这样
-fstatic-openmp
@nihui,非常感谢,更新了ndk,加了ldflags果然成功了
你好,这个问题,我也遇到了,然后我使用了ndk r21,在ld flags里用了-fopenmp -static-openmp结果仍然不可用,单独调用也是可以的,麻烦能帮我详细说一下相关的配置么
同样的问题,一个工程包含2个编译so的module(都是使用ncnn的模块) ,单独跑哪个都没问题,2个一起跑就崩了,报错是(__kmp_abort_process+44),链接已经加上了 -fopenmp -static-openmp,还是老样子
按照 @DolbyYu的方式合一起确实好了,但是我需要分发2个so,还是必须得分开,望大神帮忙
同样的问题,一个工程包含2个编译so的module(都是使用ncnn的模块) ,单独跑哪个都没问题,2个一起跑就崩了,报错是(__kmp_abort_process+44),链接已经加上了 -fopenmp -static-openmp,还是老样子
按照 @DolbyYu的方式合一起确实好了,但是我需要分发2个so,还是必须得分开,望大神帮忙
@wangyangneu @zdx3145 生成每个.so库的时候,指定openmp.so的路径来链接openmp的动态库,我是这么解决的,希望可以帮到你。
我也碰到了类似的问题,最后讲两个jni的链接库改成一个。问题解决
如果是静态加载的ncnn.a,需要编译.a的时候就做修改,否则只修改so中的配置还是会报错 @zdx3145
@wangyangneu 请教一下,如何在编译.a的时候修改..
同样的问题,一个工程包含2个编译so的module(都是使用ncnn的模块) ,单独跑哪个都没问题,2个一起跑就崩了,报错是(__kmp_abort_process+44),链接已经加上了 -fopenmp -static-openmp,还是老样子
按照 @DolbyYu的方式合一起确实好了,但是我需要分发2个so,还是必须得分开,望大神帮忙@wangyangneu @zdx3145 生成每个.so库的时候,指定openmp.so的路径来链接openmp的动态库,我是这么解决的,希望可以帮到你。
问下是怎么指定openmp.so的路径来链接openmp的啊,谢谢
最近在做一个 android 应用,需要提供两套 inference engine(NCNN 和 SNPE [闭源的 没法编译成一个库])。
- 不加载 SNPE,跑 NCNN 可以
- 加载了 SNPE, NCNN 会 fail 在 net.load_model() 方法上
有什么解决方法嘛?谢谢
@nihui
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'Android/sdm845/sdm845:8.1.0/OPM1.171019.026/449:userdebug/test-keys'
Revision: '0'
ABI: 'arm64'
pid: 19518, tid: 19518, name: whim.ai.whimdet >>> com.whim.ai.whimdet <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
x0 0000000000000000 x1 0000000000004c3e x2 0000000000000006 x3 0000000000000008
x4 0000000004d78450 x5 0000000004d78450 x6 0000000004d78450 x7 00000000001fffff
x8 0000000000000083 x9 0000000010000000 x10 0000007fdc82bed0 x11 29fa1682f7847293
x12 29fa1682f7847293 x13 0000000000000001 x14 ffffffffffffffdf x15 00000077b71778a8
x16 0000005dc186dfa8 x17 00000077b70fa08c x18 0000007735a00080 x19 0000000000004c3e
x20 0000000000004c3e x21 0000000000000083 x22 0000007717f857f2 x23 000000771c66e9d6
x24 0000007717f857f6 x25 0000007717ff3000 x26 000000771c66e9d6 x27 00000077baa58a40
x28 0000007717f7a668 x29 0000007fdc82bf10 x30 00000077b70a08c0
sp 0000007fdc82bed0 pc 00000077b70a08e8 pstate 0000000060000000
v0 00000000000000000000000000000200 v1 0000007fdc82bc200000007fdc82bc90
v2 0000007fdc82bff00000007fdc82c070 v3 00000002000000000000000000000000
v4 80200000000000000000000000000000 v5 00000000000000000000000000000000
v6 00000000000000000000040000000000 v7 80200802802008028020080280200802
v8 00000000000000000000000000000000 v9 00000000000000000000000000000000
v10 00000000000000000000000000000000 v11 00000000000000000000000000000000
v12 00000000000000000000000000000000 v13 00000000000000000000000000000000
v14 00000000000000000000000000000000 v15 00000000000000000000000000000000
v16 40100401401004014010040140100401 v17 a000000000040000a000040002000000
v18 80200000000000000000040000000000 v19 0000000008cd4fb00000000000000000
v20 00000000000000000000000000000000 v21 0000000008cd4fb00000000000000000
v22 0000000001fe6c4e0000000000000000 v23 0000000008cd4fb00000000000000000
v24 00000000000000000000000000000000 v25 000000000acbbbfe0000000000000000
v26 00000000000000000000000000000000 v27 000000000acbbbfe0000000000000000
v28 00000000000000000000000000000000 v29 000000000acbbbfe0000000000000000
v30 00000000000000000000000000000000 v31 000000000acbbbfe0000000000000000
fpsr 08000013 fpcr 00000000
backtrace:
#00 pc 000000000001e8e8 /system/lib64/libc.so (abort+120)
#01 pc 000000000039cb24 /data/app/com.whim.ai.whimdet-YJ1HnoMZ0xdGhMzt4DR1fg==/lib/arm64/libwhim-det.so (__kmp_abort_process+44)
stack:
0000007fdc82be50 0000000000000000
0000007fdc82be58 206e656562206576
0000007fdc82be60 0000007fdc82bec0 [stack]
0000007fdc82be68 0000005dc186b9dc /system/bin/app_process64 (sigprocmask+288)
0000007fdc82be70 2e6d6172676f7270
0000007fdc82be78 7369207461685420
0000007fdc82be80 ffffffffffffffdf
0000007fdc82be88 29fa1682f7847293
0000007fdc82be90 0000007717f857f6 /data/app/com.whim.ai.whimdet-YJ1HnoMZ0xdGhMzt4DR1fg==/lib/arm64/libwhim-det.so
0000007fdc82be98 000000771c66e9d6 [anon:libc_malloc]
0000007fdc82bea0 0000007717f857f2 /data/app/com.whim.ai.whimdet-YJ1HnoMZ0xdGhMzt4DR1fg==/lib/arm64/libwhim-det.so
0000007fdc82bea8 0000000000000000
0000007fdc82beb0 0000000000004c3e
0000007fdc82beb8 0000000000004c3e
0000007fdc82bec0 0000007fdc82bf10 [stack]
0000007fdc82bec8 00000077b70a08c0 /system/lib64/libc.so (abort+80)
#00 0000007fdc82bed0 0000007f00000273
0000007fdc82bed8 7369206f64206f74
0000007fdc82bee0 0000007717f7a668 /data/app/com.whim.ai.whimdet-YJ1HnoMZ0xdGhMzt4DR1fg==/lib/arm64/libwhim-det.so
0000007fdc82bee8 2074616874206572
0000007fdc82bef0 0000000000000000
0000007fdc82bef8 ffffffffffffffdf
0000007fdc82bf00 000000771c66e9c0 [anon:libc_malloc]
0000007fdc82bf08 000000771c736000 [anon:libc_malloc]
0000007fdc82bf10 0000007fdc82bf20 [stack]
0000007fdc82bf18 0000007717eb0b28 /data/app/com.whim.ai.whimdet-YJ1HnoMZ0xdGhMzt4DR1fg==/lib/arm64/libwhim-det.so (__kmp_abort_thread)
#01 0000007fdc82bf20 0000007fdc82c060 [stack]
0000007fdc82bf28 0000007717eaf564 /data/app/com.whim.ai.whimdet-YJ1HnoMZ0xdGhMzt4DR1fg==/lib/arm64/libwhim-det.so (__kmp_vprintf)
0000007fdc82bf30 0000000000000000
0000007fdc82bf38 0000000000000000
0000007fdc82bf40 0000007fdc82c070 [stack]
0000007fdc82bf48 0000007fdc82bdf0 [stack]
0000007fdc82bf50 696c2d6230353265
0000007fdc82bf58 0000612e706d6f62
0000007fdc82bf60 0000000000000000
0000007fdc82bf68 0000000200000000
0000007fdc82bf70 0000000000000000
0000007fdc82bf78 8020000000000000
0000007fdc82bf80 0000000000000000
0000007fdc82bf88 0000000000000000
0000007fdc82bf90 0000040000000000
0000007fdc82bf98 0000000000000000
Maybe I solved the problem.
manually set the allocator with ncnn::PoolAllocator.
eg:
ncnn::PoolAllocator g_blob_pool_allocator;
ncnn::PoolAllocator g_workspace_pool_allocator;
....
//when init model param
this->_opt.workspace_allocator = &(this->g_workspace_pool_allocator);
this->_opt.blob_allocator = &(this->g_blob_pool_allocator);
Maybe your Vulkan Lib version is so lower
@wangyangneu 请教一下,如何在编译.a的时候修改..
如果两个so同时使用一个ncnn.a,需要在编译ncnn.a的时候就加上-Wl,-Bstatic -lomp -Wl,-Bdynamic或者-fstatic-openmp
@wangyangneu 请教一下,如何在编译.a的时候修改..
如果两个so同时使用一个ncnn.a,需要在编译ncnn.a的时候就加上-Wl,-Bstatic -lomp -Wl,-Bdynamic或者-fstatic-openmp
@wangyangneu 您好,我也遇到了同样的问题,我用的是r15c版本的安卓ndk,貌似这个问题是两个动态库依赖同一个静态的libomp.a库导致的。希望指导一下,如何在编译ncnn.a的时候加上-Wl,-Bstatic -lomp -Wl,-Bdynamic, 不知道还有没有其他的解决办法。
@wangyangneu 请教一下,如何在编译.a的时候修改..
如果两个so同时使用一个ncnn.a,需要在编译ncnn.a的时候就加上-Wl,-Bstatic -lomp -Wl,-Bdynamic或者-fstatic-openmp
@wangyangneu 您好,我也遇到了同样的问题,我用的是r15c版本的安卓ndk,貌似这个问题是两个动态库依赖同一个静态的libomp.a库导致的。希望指导一下,如何在编译ncnn.a的时候加上-Wl,-Bstatic -lomp -Wl,-Bdynamic, 不知道还有没有其他的解决办法。
的是r15c版本的安卓ndk,貌似这个问题是两个动态库依赖同一个静态的libomp.a库导致的。希望指导一下,如何在编译ncnn.a的时候加上-Wl,-Bstatic -lomp -Wl,-Bdynamic, 不知道还有没有其他的解决办法。
关掉openmp
option(NCNN_OPENMP "openmp support" OFF)
然后
if(NOT NCNN_OPENMP)
add_definitions(-Wl,-Bstatic -lomp -Wl,-Bdynamic)
endif(NOT NCNN_OPENMP)
有加上-Wl,-Bstatic -lomp -Wl,-Bdynamic编好的ncnn.a供下载使用吗?
遇到了一样的问题,这个问题是NCNN的还是Android NDK的又或是Android系统的?
同一套代码在最新的MIU 13 (22.3.21) 手机上就报这个错误,其他手机(华为、三星)都能正常运行。
完全不知道怎么解决,看大家描述是有两个NCNN实例的时候会报这个错,可是我只有一个so,在执行net.load_model() 的时候就崩溃了。
用的CMake,-fstatic-openmp加在那里???有没有朋友可以指导一下?
2022-03-23 11:41:12.979 15211-15211/com.example.myapplication A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 15211 (e.myapplication), pid 15211 (e.myapplication)
2022-03-23 11:41:12.998 15326-15326/? E/DEBUG: failed to readlink /proc/15211/fd/136: No such file or directory
2022-03-23 11:41:13.018 15326-15326/? E/DEBUG: failed to read /proc/uptime: Permission denied
2022-03-23 11:41:13.138 25581-25733/? E/ServiceScheduleManager: Enter loop()!!! is sync =
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Build fingerprint: 'Xiaomi/umi/umi:12/SKQ1.220201.001/22.3.18:user/release-keys'
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Revision: '0'
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: ABI: 'arm64'
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Timestamp: 2022-03-23 11:41:13.018507274+0800
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Process uptime: 0s
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Cmdline: com.example.myapplication
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: pid: 15211, tid: 15211, name: e.myapplication >>> com.example.myapplication <<<
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: uid: 11180
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x0 0000000000000000 x1 0000000000003b6b x2 0000000000000006 x3 0000007fea095340
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x4 727245203a504d4f x5 727245203a504d4f x6 727245203a504d4f x7 3a3030312320726f
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x8 00000000000000f0 x9 e4b5a6374b057d50 x10 0000000000000000 x11 ffffff80fffffbdf
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x12 0000000000000001 x13 20726f727265206d x14 0000000000000010 x15 0000000000000000
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x16 000000724fb5bd30 x17 000000724fb35870 x18 000000725cf1a000 x19 0000000000003b6b
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x20 0000000000003b6b x21 00000000ffffffff x22 000000711f74c240 x23 00000071107c1b70
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x24 00000071107c4038 x25 00000071107c4048 x26 0000000000000004 x27 0000000000000000
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x28 0000000000000000 x29 0000007fea0953c0
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: lr 000000724fae5c1c sp 0000007fea095320 pc 000000724fae5c48 pst 0000000000001000
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: backtrace:
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: #00 pc 000000000008bc48 /apex/com.android.runtime/lib64/bionic/libc.so (abort+168) (BuildId: d15a6afaad4d7e44de8683bcf906a6bd)
2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: #01 pc 000000000033af38 /data/app/~~1MugYLVBvekm8KFCQVq88w==/com.example.myapplication-lVYBnDWiIQuylks1r4t3aA==/lib/arm64/libthai_ncnn_lib.so (__kmp_abort_process+44) (BuildId: 569c921dc8e5dab352dea20515b6267948afc9e8)
===更新===
刚刚试了试官方提供的Demo一样也会在加载模型的时候崩溃,相同错误。我准备换TNN试一试了...
https://github.com/nihui/ncnn-android-styletransfer
JNI接口使用两个本地lib,分别编译成动态库mtcnn.so和mfnet.so。两个动态库都基于ncnn,且都链接了libncnn.a的静态库。 运行时,mtcnn功能正常,运行到mfnet时报错。尝试不加载mtcnn时(或者注释掉所有mtcnn的.load_param()方法),mfnet可以跑通,不报错。 另外我发现这并不一定时mfnet的问题,当我把mfnet的所有代码替换为mtcnn时(即mfnet.so和mtcnn.so相同),同样在运行第二个本地库时报错,且错误相同?
请问大神该如何解决?
AS的Logcat报错信息如下:
2017-08-05 19:25:41.912 20274-20274/com.example.dms A/libc:致命信号 6 (SIGABRT),tid 20274 (com.example.dms) 中的代码 -6,pid 20274 (com.example .dms) 2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** * ** 2017-08-05 19:25:41.997 20339-20339/? A/DEBUG:构建指纹:'rockchip/rk3399pro/rk3399pro:8.1.0/OPM8.190305.001/101257:userdebug/test-keys' 2017-08-05 19:25:41.997 20339-20339/? A/DEBUG:修订:'0' 2017-08-05 19:25:41.997 20339-20339/?A/DEBUG: ABI: 'arm64' 2017-08-05 19:25:41.997 20339-20339/? A/DEBUG: pid: 20274, tid: 20274, name: com.example.dms >>> com.example.dms <<< 2017-08-05 19:25:41.997 20339-20339/? A/DEBUG:信号 6 (SIGABRT),代码 -6 (SI_TKILL), 2017-08-05 19:25:41.997 20339-20339/? A/调试:x0 0000000000000000 x1 0000000000004f32 x2 0000000000000006 x3 0000000000000008 2017-08-05 19:25:41.997 20339-20339/?A/调试:x4 0000007999fd6000 x5 0000007999fd6000 x6 0000007999fd6000 x7 00000000001c7ea0 2017-08-05 19:25:41.997 20339-20339/?A/调试:x8 0000000000000083 x9 0000000010000000 x10 0000007ff69ab5e0 x11 0000000000000001 2017-08-05 19:25:41.997 20339-20339/?A/调试:x12 0000000000000018 x13 00000003e8000000 x14 00364add5e425850 x15 00000f704fc4ba2b 2017-08-05 19:25:41.997 20339-20339/?A/调试:x16 00000059ddea0fa8 x17 000000799688752c x18 00000078fc6e5400 x19 0000000000004f32 2017-08-05 19:25:41.997 20339-20339/? A/调试:x20 0000000000004f32 x21 0000000000000083 x22 00000078fd3f0cea x23 00000079154e11d6 2017-08-05 19:25:41.997 20339-20339/?A/调试:x24 00000078fd3f0cee x25 00000078fd43a000 x26 000000791558964c x27 0000007ff69ab970 2017-08-05 19:25:41.997 20339-20339/?A/调试:x28 000000799a13fa40 x29 0000007ff69ab620 x30 000000799683c760 2017-08-05 19:25:41.997 20339-20339/?A/DEBUG: sp 0000007ff69ab5e0 pc 000000799683c788 pstate 0000000060000000 2017-08-05 19:25:41.999 20339-20339/? A/DEBUG:回溯: 2017-08-05 19:25:41.999 20339-20339/?A/DEBUG: #00 pc 000000000001d788 /system/lib64/libc.so (abort+120) 2017-08-05 19:25:41.999 20339-20339/? 调试: #1pc 000000000015e498 /data/app/com.example.dms-hnU3L7aK-rU0IqLRnkVVkg==/lib/arm64/libmfnet.so (__kmp_abort_process+44)
求大佬解答,一模一样的问题
是在cmakelists中修改添加set(CMAKE_LD_FLAGS "${CMAKE_LD_FLAGS} -fstatic-openmp")吗
ncnn加载两个动态库报错的问题怎么解决啊 可以帮忙说说吗
同样的问题,一个工程包含2个编译so的module(都是使用ncnn的模块) ,单独跑哪个都没问题,2个一起跑就崩了,报错是(__kmp_abort_process+44),链接已经加上了 -fopenmp -static-openmp,还是老样子 按照 @DolbyYu的方式合一起确实好了,但是我需要分发2个so,还是必须得分开,望大神帮忙
怎么分开加载两个so才不报错 你解决了吗
问下是怎么指定openmp.so的路径来链接openmp的啊,谢谢
同样的问题,一个工程包含2个编译so的module(都是使用ncnn的模块) ,单独跑哪个都没问题,2个一起跑就崩了,报错是(__kmp_abort_process+44),链接已经加上了 -fopenmp -static-openmp,还是老样子 按照 @DolbyYu的方式合一起确实好了,但是我需要分发2个so,还是必须得分开,望大神帮忙
这个问题怎么解决呢 加载两个so
@liuxiaoxiao666 建议两个so依赖同一个libncnn.so,而不是分别静态链接libncnn.a。
如果非要静态链接两个libncnn.a,需要重新编译libncnn.a,在CMakeLists.txt中添加如下代码以静态链接openmp(但是貌似ncnn默认已经是静态链接openmp了?有点迷惑):
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-Bstatic -lomp -Wl,-Bdynamic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-Bstatic -lomp -Wl,-Bdynamic")
新版本ndk尝试:
set_target_properties(target PROPERTIES COMPILE_OPTIONS -fopenmp)
target_link_libraries(
target
-fopenmp -static-openmp)
之前实测ndk r21e还是第一种方法有效。
如果有其他链接了openmp的库,最好也要静态链接openmp。
安卓项目中遇到了第三方人脸识别SDK(闭源)和ncnn+opencv中都链接了openmp,导致fatal crash,然后自己把源码下下来自己编译,把openmp off掉,解决了冲突问题,但对于多线程会有什么影响我没深究,总之能跑出结果不崩了,感谢作者(捂
There are two steps to solve this problem
-
build ncnn with these flags :
cmake -DCMAKE_TOOLCHAIN_FILE="....." -DANDROID_ABI="armeabi-v7a" -DNCNN_OPENMP=OFF -DNCNN_DISABLE_EXCEPTION=OFF -DANDROID_PLATFORM=android-21 .. -
add this to your apps cmakelist
target_link_libraries( # Specifies the target library.
yourlibrary
-static-openmp ......)
遇到了一样的问题,这个问题是NCNN的还是Android NDK的又或是Android系统的?
同一套代码在最新的MIU 13 (22.3.21) 手机上就报这个错误,其他手机(华为、三星)都能正常运行。
完全不知道怎么解决,看大家描述是有两个NCNN实例的时候会报这个错,可是我只有一个so,在执行net.load_model() 的时候就崩溃了。
用的CMake,-fstatic-openmp加在那里???有没有朋友可以指导一下?
2022-03-23 11:41:12.979 15211-15211/com.example.myapplication A/libc: Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 15211 (e.myapplication), pid 15211 (e.myapplication) 2022-03-23 11:41:12.998 15326-15326/? E/DEBUG: failed to readlink /proc/15211/fd/136: No such file or directory 2022-03-23 11:41:13.018 15326-15326/? E/DEBUG: failed to read /proc/uptime: Permission denied 2022-03-23 11:41:13.138 25581-25733/? E/ServiceScheduleManager: Enter loop()!!! is sync = 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Build fingerprint: 'Xiaomi/umi/umi:12/SKQ1.220201.001/22.3.18:user/release-keys' 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Revision: '0' 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: ABI: 'arm64' 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Timestamp: 2022-03-23 11:41:13.018507274+0800 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Process uptime: 0s 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: Cmdline: com.example.myapplication 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: pid: 15211, tid: 15211, name: e.myapplication >>> com.example.myapplication <<< 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: uid: 11180 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr -------- 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x0 0000000000000000 x1 0000000000003b6b x2 0000000000000006 x3 0000007fea095340 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x4 727245203a504d4f x5 727245203a504d4f x6 727245203a504d4f x7 3a3030312320726f 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x8 00000000000000f0 x9 e4b5a6374b057d50 x10 0000000000000000 x11 ffffff80fffffbdf 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x12 0000000000000001 x13 20726f727265206d x14 0000000000000010 x15 0000000000000000 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x16 000000724fb5bd30 x17 000000724fb35870 x18 000000725cf1a000 x19 0000000000003b6b 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x20 0000000000003b6b x21 00000000ffffffff x22 000000711f74c240 x23 00000071107c1b70 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x24 00000071107c4038 x25 00000071107c4048 x26 0000000000000004 x27 0000000000000000 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: x28 0000000000000000 x29 0000007fea0953c0 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: lr 000000724fae5c1c sp 0000007fea095320 pc 000000724fae5c48 pst 0000000000001000 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: backtrace: 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: #00 pc 000000000008bc48 /apex/com.android.runtime/lib64/bionic/libc.so (abort+168) (BuildId: d15a6afaad4d7e44de8683bcf906a6bd) 2022-03-23 11:41:13.208 15326-15326/? A/DEBUG: #01 pc 000000000033af38 /data/app/~~1MugYLVBvekm8KFCQVq88w==/com.example.myapplication-lVYBnDWiIQuylks1r4t3aA==/lib/arm64/libthai_ncnn_lib.so (__kmp_abort_process+44) (BuildId: 569c921dc8e5dab352dea20515b6267948afc9e8)
===更新=== 刚刚试了试官方提供的Demo一样也会在加载模型的时候崩溃,相同错误。我准备换TNN试一试了... https://github.com/nihui/ncnn-android-styletransfer
老哥你解决了吗,我现在跟你的情况一模一样,也是在加载模型的时候就挂了,并且也是只有小米和红米的会挂,其他手机没事。唯一的区别是我用的mnn。我的两个so是依赖的同一个mnn的so,所以跟其他人的情况并不一样,但是我的场景是会并行,在两个线程里都会加载模型,所以也算是两个实例了。