大佬教程收集整理的这篇文章主要介绍了Android Studio链接OpenCV静态库,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我接下来要做的是通过NDK将所有Java逻辑实现到C(以提高性能).这样我就不需要将MAT对象转换回字节缓冲区和堡垒,从而节省了几个周期.但我真的很难尝试使用gradle链接.so,.a静态库和头文件,以便在我的.CPP文件上使用.
这是我正在使用的gradle文件:
apply plugin: 'com.android.model.application' def opencvandroid_sdk_path = file(project(':opencvandroid').projectDir).absolutePath + "/src/main" model { repositories { libs(PrebuiltLibraries) { opencv { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_calib3d.a") } } opencv1 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_core.a") } } opencv2 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_features2d.a") } } opencv3 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_flAnn.a") } } opencv4 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_highgui.a") } } opencv5 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgcodecs.a") } } opencv6 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgproc.a") } } opencv7 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_ml.a") } } opencv8 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_objdetect.a") } } opencv9 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_photo.a") } } opencv10 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_shape.a") } } opencv11 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_stitching.a") } } opencv12 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_superres.a") } } opencv13 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_video.a") } } opencv14 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videoio.a") } } opencv15 { headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2" binaries.withType(StaticLibraryBinary) { staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videostab.a") } } } } android { compileSdkVersion = 23 buildToolsVersion = "23.0.2" defaultConfig.with { applicationId = "com.example" minSdkVersion.apiLevel = 16 targetSdkVersion.apiLevel = 23 versionCode = 1 versionName = "1.0" } } /* * native build setTings */ android.ndk { modulename = "Hello-jni" /* * Other ndk flags configurable here are * cppFlags += "-fno-rtti" * cppFlags += "-fno-exceptions" * ldLibs = ["android","log"] * stl = "system" */ platformVersion = 16 //same as minSdkVersion.apiLevel for better compatibility /*def jniPath = opencvandroid_sdk_path + "jniLibs" cppFlags += "-I${file(jniPath)}".toString() file(jniPath).eachDirRecurse { dir -> cppFlags += "-I${file(dir)}".toString() }*/ stl = "c++_static" ldLibs.addAll(["atomic","log","android"]) } android.sources { main { jni { dependencies { library "opencv1" linkage "static" library "opencv2" linkage "static" library "opencv3" linkage "static" library "opencv4" linkage "static" library "opencv5" linkage "static" library "opencv6" linkage "static" library "opencv7" linkage "static" library "opencv8" linkage "static" library "opencv9" linkage "static" library "opencv10" linkage "static" library "opencv11" linkage "static" library "opencv12" linkage "static" library "opencv13" linkage "static" library "opencv14" linkage "static" library "opencv15" linkage "static" } } } } android.buildTypes { release { minifyEnabled = false } } } dependencies { compile fileTree(dir: 'libs',include: ['*.jar']) TESTCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile project(':opencvandroid') }
我将我的gradle文件基于我在github上找到的this示例.
现在,我发现尝试这样做的一个问题是OPENCV有几个静态库文件,所以正如post所说,我必须在gradle上的不同lib上添加每个文件以便链接它们,所以这就是为什么我的gradle文件充满了重复的库定义.
现在,当我试图在我的.CPP代码中包含头文件时,Android studio找不到它们(甚至不能使用命名空间).这是我的CPP代码:
#include <jni.h> #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/features2d/features2d.hpp" #include <vector> using namespace std; using namespace cv; extern "C" { JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(jnienv*,jobject,jlong adDRGray,jlong addrRgba); JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(jnienv*,jlong addrRgba) { Mat& mGr = *(Mat*)adDRGray; Mat& mRgb = *(Mat*)addrRgba; vector<KeyPoint> v; Ptr<FeatureDetector> detector = FastFeatureDetector::create(50); detector->detect(mGr,v); for( unsigned int i = 0; i < v.size(); i++ ) { const KeyPoint& kp = v[i]; circle(mRgb,Point(kp.pt.x,kp.pt.y),10,Scalar(255,255)); } } }
CV_LIBS = \ $(CV_LIB_FOLDER)/libopencv_calib3d.a \ $(CV_LIB_FOLDER)/libopencv_highgui.a \ $(CV_LIB_FOLDER)/libopencv_video.a \ $(CV_LIB_FOLDER)/libopencv_objdetect.a \ $(CV_LIB_FOLDER)/libopencv_imgproc.a \ $(CV_LIB_FOLDER)/libopencv_imgcodecs.a \ $(CV_LIB_FOLDER)/libopencv_core.a \ $(CV_LIB_FOLDER)/libopencv_hal.a
以上是大佬教程为你收集整理的Android Studio链接OpenCV静态库全部内容,希望文章能够帮你解决Android Studio链接OpenCV静态库所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。