opencv4android编译静态库,Android Studio链接OpenCV静态库

目前我正在开发一个使用OpenCV3进行实时视频处理(应用一组彩色滤镜)的项目,我设法让它与Java一起使用而没有任何问题.

我接下来要做的是通过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

#include "opencv2/core/core.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/features2d/features2d.hpp"

#include

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*, jobject, jlong addrGray, jlong addrRgba)

{

Mat& mGr = *(Mat*)addrGray;

Mat& mRgb = *(Mat*)addrRgba;

vector v;

Ptr 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,0,0,255));

}

}

}

我错过了一些东西,以便正确地链接它们吗?

解决方法:

OpenCV静态库之间存在依赖关系.所以你需要以正确的顺序包含它们. .a和.o包含依赖于GCC的顺序,具有依赖关系的文件必须包含在它们所依赖的文件之前:

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

标签:c-2,android,opencv,android-studio,android-ndk

来源: https://codeday.me/bug/20190628/1313323.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值