Setup:
We are currently using OpenCV on iOS and Android for image processing. On Android we import OpenCV as a .aar
and on iOS we import it via Cocoapods, and they call the same underlying functions.
Problem:
We would like to have a KMM project where we can import OpenCV and share the business logic. We are using expect/actual
to depend on OpenCV in platform specific code.
We can make it work for Android by importing the same .aar
in androidMain
.
Our problem is with iOS. Currently KMM doesn't support interoperability with C++ (which OpenCV is written in) - see https://kotlinlang.org/docs/roadmap.html#removed-items
What we have tried:
We tried to link a .framework
via Gradle and create .def
files to point to the .hpp
files in OpenCV but we get an error xxx.hpp header must be compiled as C++
when trying to sync Gradle.
build.gradle.kts
iosX64() {
compilations.getByName("main") {
val OpenCV by cinterops.creating {
// Path to .def file
defFile("src/iosMain/cinterop/OpenCV.def")
// Directories for header search (an analogue of the -I<path> compiler option)
includeDirs("../iosApp/Pods/OpenCV/opencv2.framework/Headers/Core")
}
}
binaries.all {
// Linker options required to link to the library.
linkerOpts("-L/../iosApp/Pods/OpenCV/opencv2.framework", "-lopencv2")
}
}
OpenCV.def
headers = cvstd.hpp
package = OpenCV
Question:
Is there any way to depend on OpenCV in KMM?