2016-11-28 120 views
1

我想链接Android Studio 2.2中的opencv本机库。我发现的所有主题都是在Android Studio无法找到的build.gradle文件中使用Android.mk文件或其他方法。Android Studio 2.2链接opencv静态库

我正在使用Android Studio 2.2并通过使用C++支持创建一个新项目来创建该项目。

到目前为止,我成功地包括在C++源文件OpenCV的库:

#include <jni.h> 
#include <string> 
#include "opencv.hpp" 

extern "C" 
jstring 
Java_com_rvstudios_roomscanner_capp_MainActivity_stringFromJNI(
     JNIEnv *env, 
     jobject /* this */) { 
    std::string hello = "Hello from C++"; 

    cv::Mat image; 
    cv::cvtColor(image, image, CV_BGR2GRAY); 

    return env->NewStringUTF(hello.c_str()); 
} 

当我尝试建立这个我得到了OpenCV函数未定义引用错误,是因为在静态库(。一个文件)必须被链接。从我已经读过的应该在build.gradle文件中完成。

这是迄今为止我的build.gradle文件:

apply plugin: 'com.android.application' 

def targetPlatform = "mips" 

android { 
    compileSdkVersion 23 
    buildToolsVersion "25.0.1" 
    defaultConfig { 
     applicationId "com.rvstudios.roomscanner.capp" 
     minSdkVersion 18 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     externalNativeBuild { 
      cmake { 
       cppFlags "" 
       cppFlags.add("-isystem${project.rootDir}/app/src/main/cpp/vision".toString()) 
      } 
     } 
    } 
    sourceSets.main { 
     jni.srcDirs = ["${project.rootDir}/app/src/main/jniLibs/${targetPlatform.toString()}/"] 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
    externalNativeBuild { 
     cmake { 
      path "CMakeLists.txt" 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
    testCompile 'junit:junit:4.12' 
} 

我坚持在这里,因为我不知道如何来链接静态库。我已经看到了大量有关同样问题的SO主题,但是我阅读的所有内容都使用不同的项目设置,而且我对Android开发不熟悉,所以我根本就不了解它。

EDIT1: 我的CMakeLists.txt:

# Sets the minimum version of CMake required to build the native 
# library. You should either keep the default value or only pass a 
# value of 3.4.0 or lower. 

cmake_minimum_required(VERSION 3.4.1) 

# Creates and names a library, sets it as either STATIC 
# or SHARED, and provides the relative paths to its source code. 
# You can define multiple libraries, and CMake builds it for you. 
# Gradle automatically packages shared libraries with your APK. 

add_library(# Sets the name of the library. 
      native-lib 

      # Sets the library as a shared library. 
      SHARED 

      # Provides a relative path to your source file(s). 
      # Associated headers in the same location as their source 
      # file are automatically included. 
      src/main/cpp/native-lib.cpp 
      src/main/cpp/vision/opencv.hpp) 

# Searches for a specified prebuilt library and stores the path as a 
# variable. Because system libraries are included in the search path by 
# default, you only need to specify the name of the public NDK library 
# you want to add. CMake verifies that the library exists before 
# completing its build. 

find_library(# Sets the name of the path variable. 
       log-lib 

       # Specifies the name of the NDK library that 
       # you want CMake to locate. 
       log) 

# Specifies libraries CMake should link to your target library. You 
# can link multiple libraries, such as libraries you define in the 
# build script, prebuilt third-party libraries, or system libraries. 

target_link_libraries(# Specifies the target library. 
         native-lib 

         # Links the target library to the log library 
         # included in the NDK. 
         ${log-lib} 

         ) 
+0

你加 'opencv.hpp' 作为一个库的CMakeLists.txt? – mcemilg

+0

是的,我做到了!我将我的CMakeLists.txt添加到问题领域! –

+0

尝试包含'opencv.hpp'文件,如下所示; #include“vision/opencv.hpp” – mcemilg

回答

0

到的CMakeLists.txt,添加:

set(pathToOpenCV /Users/admin/Projects/OpenCV-android-sdk/sdk/native/) // Replace with your OpenCV SDK path 
include_directories(${pathToOpenCV}/jni/include)