2016-06-10 38 views
2

我想嘗試SDK附帶的示例代碼之一,即「tutorial-2-mixedprocessing」。餘按照這些步驟:AndroidStudio無法找到OpenCV標頭

1)導入項目 - >選擇的教程目錄

2)I將其命名爲「教程-2- mixedprocessing1」,左打勾3個選項(「在可能的情況更換罐& LIB源」和「創建搖籃式模塊名稱」)

3)警告:「在目前的插件已過時NDK一體化」我點擊「設置‘android.useDeprecatedNdk =真’在gradle.properties繼續使用目前的NDK整合「

4)導入模塊 - >選定的Java模塊這是在「C:\的SDK \的OpenCV-Android的SDK \ SDK \ java的」在我的情況下 - >左3複選框打勾

5)錯誤:原因:在C:\ Users \ c010 \ AppData \ Local \ Android \ Sdk中找不到哈希字符串'android-14'的目標安裝缺少的平臺和同步項目。我改變了compileSdkversion,buildToolsVersion和targetSdkVersion並同步。錯誤消失。

6-7)打開模塊設置 - >依賴關係添加Opencv模塊作爲模塊依賴關係。新增NDK位置(「C:\的SDK \ Android的NDK-R12-β2」在我的情況)

8)建立 - >使項目負責人錯誤:(2,33)opencv2 /核心/ core.hpp:沒有這樣的文件或目錄

在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',結果相同。

我編輯看起來像

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托架如下gradle這個文件:

ndk { 
    moduleName "mixed_sample" 
    cFlags += "-I${file("C:/SDKs/OpenCV-android-sdk/sdk/native/jni/include")}".toString() 
} 

錯誤:錯誤:空IC:\的SDK \的OpenCV-Android的SDK \ sdk \ native \ jni \ include:無效參數

它不接受cppFlags 錯誤:(14,0)無法在co上找到屬性'cppFlags' [email protected]2。

回答

1

如果你想製作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實驗性的,但你也可以選擇gradle這個0.7.0,但在這種情況下,你需要看到什麼是gradle這個0.7.0語法的變化。

我建議你開始創建你的JNI橋來使用opencv C++函數,並嘗試爲opencv庫創建構建gradle文件。

不要忘記導入opencv文件夾作爲file-> new-> import項目中的庫。 希望這段代碼會有幫助

乾杯。

+0

線有一個名爲 'libsDir' 字符串。它在哪裏使用?隨着你的幫助和[這裏]的教程(https://codelabs.developers.google.com/codelabs/android-studio-jni/index.html?index=..%2F..%2Findex#0),它編譯,但現在我看到一些鏈接器錯誤(如'未定義引用'cv :: FastFeatureDetector :: create(int,bool,int)'')。 – jannarc

+0

libsDir是存在第三方庫鏈接的目錄路徑。如果你不需要使用。你的鏈接問題是因爲你在gradle文件中沒有鏈接opnecv C++ .so文件。這個問題更加廣泛和困難。你可以嘗試這個鏈接,http://stackoverflow.com/questions/34701003/android-studio-linking-opencv-static-libraries,它沒有解決,但可能你會有更多的想法。 – uelordi

0

附加按照您的build.gradle

sourceSets.main {

jni.srcDirs = [] //disable automatic ndk-build call 
    jniLibs.srcDir 'src/main/jniLibs' 
} 

buildTypes { ... }