OpenCV Android本地代码构建问题

5
我正在学习使用OpenCV编写C++代码,并希望在Android上运行它。我使用的是Android Studio。
我创建了一个带有C++支持的新项目,然后将我的测试代码添加到C++文件中。我的自定义文件似乎已经编译和链接成功。
但是现在出现了很多错误,我认为这与我的项目无关,似乎是NDK内部的问题。这可能是最新版本中的一个bug,请问我该怎么办?
  C:/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: C:/Android/OpenCV-android-sdk/sdk/native/3rdparty/libs/x86/libippicv.a(jmp_icvippiCopyConstBorder_8u_C4IR_L_as.s.o): relocation R_386_GOTOFF against preemptible symbol icv_ippJumpIndexForMergedLibs cannot be used when making a shared object
  C:/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: C:/Android/OpenCV-android-sdk/sdk/native/3rdparty/libs/x86/libippicv.a(jmp_icvippiConvert_32s16u_C1RSfs_as.s.o): relocation R_386_GOTOFF against preemptible symbol icv_ippJumpIndexForMergedLibs cannot be used when making a shared object
  C:/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: C:/Android/OpenCV-android-sdk/sdk/native/3rdparty/libs/x86/libippicv.a(jmp_icvippiNormRel_L1_32f_C1R_as.s.o): relocation R_386_GOTOFF against preemptible symbol icv_ippJumpIndexForMergedLibs cannot be used when making a shared object
  C:/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: C:/Android/OpenCV-android-sdk/sdk/native/3rdparty/libs/x86/libippicv.a(jmp_icvippiFilterBilateralBorderInit_L_as.s.o): relocation R_386_GOTOFF against preemptible symbol icv_ippJumpIndexForMergedLibs cannot be used when making a shared object
  C:/Android/sdk/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64/lib/gcc/i686-linux-android/4.9.x/../../../../i686-linux-android/bin\ld: error: C:/Android/OpenCV-android-sdk/sdk/native/3rdparty/libs/x86/libippicv.a(jmp_icvippiScaleC_32f8u_C1R_as.s.o): relocation R_386_GOTOFF against preemptible symbol icv_ippJumpIndexForMergedLibs cannot be used when making a shared object

请附上您正在使用的make文件以构建C++源代码。 - ZdaR
我回退到使用NDK14而不是默认的最新版本NDK16,错误消失了! - Scott Johansen
@ScottJohansen 我自从更新了AndroidStudio后也遇到了同样的问题。你是如何恢复的? - PhilLab
似乎有人试图修复它:https://github.com/opencv/opencv/pull/10288 - PhilLab
1
我回滚的方法是从这里下载一个旧版本的NDK,然后手动替换它。https://developer.android.com/ndk/downloads/older_releases.html - Scott Johansen
你能把你的发现整理成一个答案吗?这可能会帮助未来的某个人。 - ZdaR
2个回答

2

如果您想要从NDK16降级到NDK14,那么您可以通过在CMakeLists.txt中添加以下内容来继续使用NDK16:

set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--exclude-libs,libippicv.a -Wl,--exclude-libs,libippiw.a")

这段代码摘自GitHub上的一个讨论


1

这可能是因为NDK r16中的默认值已更改。为了与预构建的OpenCV库保持兼容性,您需要明确选择gnustl和gcc。 - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接