Android Studio 找不到 OpenCV headers
AndroidStudio can't find OpenCV headers
我想试试 SDK 附带的示例代码之一,即 "tutorial-2-mixedprocessing"。我遵循了这些步骤:
1)导入项目->选择教程目录
2) 我将其命名为“tutorial-2-mixedprocessing1”,勾选了 3 个选项(“尽可能替换 jars 和 lib 源”和“创建 Gradle-style 模块名称”)
3) 警告:“当前插件中不推荐使用 NDK 集成” 我点击了 “在 gradle.properties 中设置 "android.useDeprecatedNdk=true" 以继续使用当前的 NDK 集成”
4) 导入模块 -> 选择 java 模块,在我的例子中是“C:\SDKs\OpenCV-android-sdk\sdk\java” -> 勾选左 3 个复选框
5) 错误:原因:无法在以下位置找到哈希字符串 'android-14' 的目标:C:\Users\c010\AppData\Local\Android\Sdk 安装缺少的平台和同步项目。 我更改了 compileSdkversion、buildToolsVersion 和 targetSdkVersion 并进行了同步。错误消失了。
6-7) 打开模块设置-> 依赖添加Opencv 模块作为模块依赖。添加了 NDK 位置(在我的例子中是“C:\SDKs\android-ndk-r12-beta2”)
8) Build -> make project leads Error:(2, 33) opencv2/core/core.hpp: No such file or directory
在 Eclipse 中我会添加一些包含路径,但我不知道如何在 Android Studio 中添加。我认为编辑 Android.mk 会有帮助:
我的Android.mk是
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ifdef OPENCV_ANDROID_SDK
ifneq ("","$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)")
include ${OPENCV_ANDROID_SDK}/OpenCV.mk
else
include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk
endif
else
include ../../sdk/native/jni/OpenCV.mk
endif
LOCAL_MODULE := mixed_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
我把它改成了纯绝对路径
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include C:\SDKs\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
LOCAL_MODULE := mixed_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
没有帮助。
我在“ifdef ...”行之前添加了'OPENCV_ANDROID_SDK := C:\SDKs\OpenCV-android-sdk\',结果相同。
我加了'LOCAL_C_INCLUDES += C:\SDKs\OpenCV-android-sdk\sdk\native\jni\include',结果一样。
我编辑了 gradle 看起来像
的文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "org.opencv.samples.tutorial2"
minSdkVersion 8
targetSdkVersion 8
ndk {
moduleName "mixed_sample"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile project(':openCVLibrary310')
}
我把ndk支架改成如下:
ndk {
moduleName "mixed_sample"
cFlags += "-I${file("C:/SDKs/OpenCV-android-sdk/sdk/native/jni/include")}".toString()
}
错误:错误:null-IC:\SDKs\OpenCV-android-sdk\sdk\native\jni\include:参数无效
它不接受 cppFlags 错误:(14, 0) 在 com.android.build.gradle.internal.dsl.NdkOptions_Decorated@797a42f2 上找不到 属性 'cppFlags'。
如果您想制作 NDK 模块,您需要将 gradle 更改为实验性。在 opencv gradle 文件和你的 gradle 文件中。
所以,首先更改您的 gradle 模块:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
您的应用 build.gradle 应该是这样的。
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "your package name"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
}
android.ndk {
moduleName = "viulib_interface_jni"
cppFlags.add("-fexceptions")
cppFlags.add("-I" + file("src/main/jni").absolutePath)
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
}
android.productFlavors {
create("arm") {
ndk.with{
abiFilters.add("armeabi")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"
}
}
create("armv7") {
ndk.with {
abiFilters.add("armeabi-v7a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
}
}
}
}
dependencies {
compile fileTree(include: ['*.jar', '*.so'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile project('openCVLibrary310')
}
我用的是gradle 0.4.0 experimetal,不过你也可以选择gradle 0.7.0,但在这种情况下,你需要看看gradle有什么变化0.7.0 语法。
我建议您开始创建 JNI 桥以使用 opencv c++ 函数,然后尝试为 opencv 库创建构建 gradle 文件。
不要忘记在文件->新建->导入项目中将opencv文件夹导入为库。
希望,这段代码会有所帮助
干杯。
在您的 build.gradle
中添加以下行
sourceSets.main {
jni.srcDirs = [] //disable automatic ndk-build call
jniLibs.srcDir 'src/main/jniLibs'
}
构建类型{
...
}
我想试试 SDK 附带的示例代码之一,即 "tutorial-2-mixedprocessing"。我遵循了这些步骤:
1)导入项目->选择教程目录
2) 我将其命名为“tutorial-2-mixedprocessing1”,勾选了 3 个选项(“尽可能替换 jars 和 lib 源”和“创建 Gradle-style 模块名称”)
3) 警告:“当前插件中不推荐使用 NDK 集成” 我点击了 “在 gradle.properties 中设置 "android.useDeprecatedNdk=true" 以继续使用当前的 NDK 集成”
4) 导入模块 -> 选择 java 模块,在我的例子中是“C:\SDKs\OpenCV-android-sdk\sdk\java” -> 勾选左 3 个复选框
5) 错误:原因:无法在以下位置找到哈希字符串 'android-14' 的目标:C:\Users\c010\AppData\Local\Android\Sdk 安装缺少的平台和同步项目。 我更改了 compileSdkversion、buildToolsVersion 和 targetSdkVersion 并进行了同步。错误消失了。
6-7) 打开模块设置-> 依赖添加Opencv 模块作为模块依赖。添加了 NDK 位置(在我的例子中是“C:\SDKs\android-ndk-r12-beta2”)
8) Build -> make project leads Error:(2, 33) opencv2/core/core.hpp: No such file or directory
在 Eclipse 中我会添加一些包含路径,但我不知道如何在 Android Studio 中添加。我认为编辑 Android.mk 会有帮助:
我的Android.mk是
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
ifdef OPENCV_ANDROID_SDK
ifneq ("","$(wildcard $(OPENCV_ANDROID_SDK)/OpenCV.mk)")
include ${OPENCV_ANDROID_SDK}/OpenCV.mk
else
include ${OPENCV_ANDROID_SDK}/sdk/native/jni/OpenCV.mk
endif
else
include ../../sdk/native/jni/OpenCV.mk
endif
LOCAL_MODULE := mixed_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
我把它改成了纯绝对路径
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include C:\SDKs\OpenCV-android-sdk\sdk\native\jni\OpenCV.mk
LOCAL_MODULE := mixed_sample
LOCAL_SRC_FILES := jni_part.cpp
LOCAL_LDLIBS += -llog -ldl
include $(BUILD_SHARED_LIBRARY)
没有帮助。
我在“ifdef ...”行之前添加了'OPENCV_ANDROID_SDK := C:\SDKs\OpenCV-android-sdk\',结果相同。
我加了'LOCAL_C_INCLUDES += C:\SDKs\OpenCV-android-sdk\sdk\native\jni\include',结果一样。
我编辑了 gradle 看起来像
的文件apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "org.opencv.samples.tutorial2"
minSdkVersion 8
targetSdkVersion 8
ndk {
moduleName "mixed_sample"
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile project(':openCVLibrary310')
}
我把ndk支架改成如下:
ndk {
moduleName "mixed_sample"
cFlags += "-I${file("C:/SDKs/OpenCV-android-sdk/sdk/native/jni/include")}".toString()
}
错误:错误:null-IC:\SDKs\OpenCV-android-sdk\sdk\native\jni\include:参数无效
它不接受 cppFlags 错误:(14, 0) 在 com.android.build.gradle.internal.dsl.NdkOptions_Decorated@797a42f2 上找不到 属性 'cppFlags'。
如果您想制作 NDK 模块,您需要将 gradle 更改为实验性。在 opencv gradle 文件和你的 gradle 文件中。
所以,首先更改您的 gradle 模块:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
您的应用 build.gradle 应该是这样的。
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "your package name"
minSdkVersion.apiLevel = 15
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
}
android.ndk {
moduleName = "viulib_interface_jni"
cppFlags.add("-fexceptions")
cppFlags.add("-I" + file("src/main/jni").absolutePath)
stl = "gnustl_shared" // Which STL library to use: gnustl or stlport
ldLibs.addAll(["android", "EGL", "GLESv2", "dl", "log", "z"])
}
android.productFlavors {
create("arm") {
ndk.with{
abiFilters.add("armeabi")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi/"
}
}
create("armv7") {
ndk.with {
abiFilters.add("armeabi-v7a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath + "/src/main/jniLibs/armeabi-v7a/"
}
}
}
}
dependencies {
compile fileTree(include: ['*.jar', '*.so'], dir: 'libs')
compile 'com.android.support:appcompat-v7:23.2.1'
compile 'com.android.support:design:23.2.1'
compile project('openCVLibrary310')
}
我用的是gradle 0.4.0 experimetal,不过你也可以选择gradle 0.7.0,但在这种情况下,你需要看看gradle有什么变化0.7.0 语法。
我建议您开始创建 JNI 桥以使用 opencv c++ 函数,然后尝试为 opencv 库创建构建 gradle 文件。
不要忘记在文件->新建->导入项目中将opencv文件夹导入为库。 希望,这段代码会有所帮助
干杯。
在您的 build.gradle
中添加以下行sourceSets.main {
jni.srcDirs = [] //disable automatic ndk-build call
jniLibs.srcDir 'src/main/jniLibs'
}
构建类型{ ... }