OpenCV与Gradle在Android NDK中的本地集成
OpenCV native integration in Android NDK with Gradle
我正在尝试使用C++中的一些代码,这些代码在android项目中使用openCV库。我使用的是Android studio 2.1和Gradle 2.1.0版本(实验版0.7.0)。问题是编译器找不到opencv库。例如,在此代码中:
#include <string.h>
#include <jni.h>
#include <opencv2/opencv.hpp>
extern "C" {
JNIEXPORT void JNICALL
Java_com_teaminfernale_gazetracker_MainActivity_filterImage(JNIEnv *env, jobject instance,
jlong matAddr) {
cv::Mat& src_img = *(cv::Mat*)matAddr;
cv::cvtColor( src_img, src_img, CV_BGR2GRAY );
}
这就是错误:
Error:(12) undefined reference to `cv::cvtColor(cv::_InputArray const&, cv::_OutputArray const&, int, int)'
Error:error: ld returned 1 exit status
Error:Execution failed for task ':app:linkMain-jniArm64-v8aDebugAllSharedLibrary'.
A build operation failed.
Linker failed while linking libmain-jni.so.
这里是我的等级文件:
built.gradle在应用程序文件夹中:
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.2"
defaultConfig.with {
applicationId = "com.teaminfernale.gazetracker"
minSdkVersion.apiLevel = 19
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
buildTypes {
release {
minifyEnabled = false
proguardFiles.add(file('proguard-android.txt'))
}
}
ndk {
moduleName = "main-jni"
cppFlags.add("-std=c++11")
cppFlags.add("-fexceptions")
cppFlags.add("-I${file("src/main/jni/include")}".toString())
ldLibs.add("android")
ldLibs.add("EGL")
ldLibs.add("GLESv2")
ldLibs.add("dl")
ldLibs.add("log")
ldLibs.add("z")
stl = "gnustl_shared"
}
}
android.productFlavors {
create("arm") {
ndk.with {
abiFilters.add("armeabi")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\armeabi\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("arm7") {
ndk.with {
abiFilters.add("armeabi-v7a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\armeabi-v7a\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("arm8") {
ndk.with {
abiFilters.add("arm64-v8a")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\arm64-v8a\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("x86") {
ndk.with {
abiFilters.add("x86")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\x86\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("x86-64") {
ndk.with {
abiFilters.add("x86_64")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\x86_64\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("mips") {
ndk.with {
abiFilters.add("mips")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\mips\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("mips-64") {
ndk.with {
abiFilters.add("mips64")
File curDir = file('./')
curDir = file(curDir.absolutePath)
String libsDir = curDir.absolutePath+"\src\main\jniLibs\mips64\"
ldFlags.add(libsDir + "libopencv_core.a")
ldFlags.add(libsDir + "libIlmImf.a")
ldFlags.add(libsDir + "liblibjasper.a")
ldFlags.add(libsDir + "liblibjpeg.a")
ldFlags.add(libsDir + "liblibpng.a")
ldFlags.add(libsDir + "liblibtiff.a")
ldFlags.add(libsDir + "liblibwebp.a")
ldFlags.add(libsDir + "libtbb.a")
ldFlags.add(libsDir + "libopencv_calib3d.a")
ldFlags.add(libsDir + "libopencv_features2d.a")
ldFlags.add(libsDir + "libopencv_flann.a")
ldFlags.add(libsDir + "libopencv_hal.a")
ldFlags.add(libsDir + "libopencv_highgui.a")
ldFlags.add(libsDir + "libopencv_imgcodecs.a")
ldFlags.add(libsDir + "libopencv_imgproc.a")
ldFlags.add(libsDir + "libopencv_ml.a")
ldFlags.add(libsDir + "libopencv_objdetect.a")
ldFlags.add(libsDir + "libopencv_photo.a")
ldFlags.add(libsDir + "libopencv_shape.a")
ldFlags.add(libsDir + "libopencv_stitching.a")
ldFlags.add(libsDir + "libopencv_superres.a")
ldFlags.add(libsDir + "libopencv_ts.a")
ldFlags.add(libsDir + "libopencv_video.a")
ldFlags.add(libsDir + "libopencv_videoio.a")
ldFlags.add(libsDir + "libopencv_videostab.a")
ldFlags.add(libsDir + "libopencv_java3.so")
}
}
create("all")
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile project(':opencv')
}
opencv文件夹中的built.gradle:
apply plugin: 'com.android.library'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 19
targetSdkVersion 23
versionCode 2480
versionName "2.4.8"
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
res.srcDirs = ['res']
aidl.srcDirs = ['src']
jniLibs.srcDir 'src/main/jniLibs'
}
}
}
主项目文件夹中的built.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle-experimental:0.7.0'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
settings.grade:
include ':app'
include ':opencv'
这里的完整项目如果可以更清楚:https://github.com/eug93/GazeTracker
很抱歉我的无能,但我没能找到任何可行的解决方案。感谢
您需要在jni文件夹中添加android.mk文件
以及build.gradle 中的以下行
sourceSets.main{
jni.srcDirs = [] //disable automatic ndk-build call
jniLibs.srcDir 'src/main/jniLibs'
}
buildTypes {
..
}
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- 将公共但非静态的成员函数与ALGLIB集成
- Android NDK传感器向事件队列报告奇怪的间隔
- 将IBM Rhapsody模型集成到VS 2019中
- 从R调用C++函数并对其进行集成时出错
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- NDK:如何通过ndkr15c包含"RefBase.h"?
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如何集成 HID USB 控制器?
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- 我们如何将CMake或ndk-build集成到Android Studio 3.0.1中?Gradle 版本是 4.1,
- 如何将OpenCV 4.0集成到纯C Android NDK项目中
- 在安卓NDK中集成POCO库
- OpenCV与Gradle在Android NDK中的本地集成
- 将tess-two(Tesseract Tools for Android)库集成到Android工作室并构建ndk的问
- 是否可以使用 Android NDK 将像 IPOPT 这样的C++求解器集成到 Android 应用程序中?
- 需要方向集成已经存在的c++代码到Android NDK