如何通过gradle externaNativeTool将特定参数(例如:opencv_dir)传递给CMake?

uel*_*rdi 5 android opencv cmake android-ndk android-studio

我试图在Android Studio中执行CMake脚本作为具有OpenCV依赖关系的externalNativeBuildTool。

我知道我可以在脚本中静态定义OpenCV,而我不想使用OpenCV管理器或android studio插件。我希望jus传递Opencv_dir参数,以避免将所有标头和库复制到项目中。

因此,总而言之,我有这个错误:

 Could not find a package configuration file provided by "OpenCV" with   any  of the following names:
    OpenCVConfig.cmake
    opencv-config.cmake
Run Code Online (Sandbox Code Playgroud)

我一直在寻找类似的解决方案:

https://developer.android.com/ndk/guides/cmake.html#build-command。

但是这些参数不令人满意,并且我试图将Opencv_dir像这样放置:

externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -fno-rtti -fexceptions "
                arguments "-DANDROID_ARM_NEON=ON -DANDROID_PLATFORM=18 
               -DOpenCV_DIR="+getOpenCVDir().toString()

            }
        }
def getOpenCVDir() {
    Properties properties = new Properties()
    properties.load(new File(rootDir.absolutePath + "/local.properties").newDataInputStream())
    def externalModuleDir = properties.getProperty('opencv.dir', null)
    if (externalModuleDir == null) {
        throw new GradleException(
                "OpenCV location not found. Define location with opencv.dir in the local.properties file!")
    }
    return externalModuleDir
}
Run Code Online (Sandbox Code Playgroud)

在本地属性上定义了opencvdir的位置

opencv.dir = {my_sdk_path} / OpenCV-android-sdk / sdk / native / jni

那么有什么方法可以通过gradle传递自定义参数来传递cmake吗?

提前致谢。

uel*_*rdi 6

我找到了解决方案,其中有一个拼写错误:

有必要将CMake标志作为列表。

之前:

 externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -fno-rtti -fexceptions "
                arguments "-DANDROID_ARM_NEON=ON -DANDROID_PLATFORM=18 
               -DOpenCV_DIR="+getOpenCVDir().toString()

            }
        }
Run Code Online (Sandbox Code Playgroud)

后:

 externalNativeBuild {
     cmake {
            arguments "-DANDROID_ARM_NEON=TRUE",   
                      "-DOpenCV_DIR="+getOpenCVDir()

           cppFlags "-std=c++11 -fno-rtti -fno-exceptions -fpermissive"
            }
        }
Run Code Online (Sandbox Code Playgroud)

现在它可以完美工作,并且可以检测到opencv_dir。