JavaCV + Android Studio + gradle - 可行吗?

15

我正在尝试在Android Studio和Gradle中使用JavaCV。我编写了以下代码片段:

   repositories {
    mavenCentral()
    maven {
        url "http://maven2.javacv.googlecode.com/git/"
    }
}

dependencies {
    compile files('libs/android-support-v4.jar')
    compile group: 'com.googlecode.javacpp', name: 'javacpp', version: '0.5'
    compile group: 'com.googlecode.javacv', name: 'javacv', version: '0.5'
}

我看到导入的库在“外部库”目录中。所以我尝试运行以下代码:

...
  IplImage zdjecie=cvLoadImage(Environment.getExternalStorageDirectory().getPath()+ "/1.bmp");
    cvSaveImage(Environment.getExternalStorageDirectory().getPath()
    + "/2.bmp", zdjecie);
...

我遇到了一个错误:
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load jniopencv_core: findLibrary returned null

我不知道应该如何处理opencv(和其他库)的.so文件。因此,我们应该如何在Android Studio中使用JavaCV?

7个回答

4

build.gradle 的依赖项中进行插入对我有效:

compile ‘org.bytedeco:javacv:+’
compile group: ‘org.bytedeco.javacpp-presets’, name: ‘opencv’, version:   ‘2.4.10–0.10', classifier: ‘android-arm’ 
compile group: ‘org.bytedeco.javacpp-presets’, name: ‘ffmpeg’, version:   ‘2.5.1–0.10', classifier: ‘android-arm’

4

1.警告: 这不够好!:

  dependencies { compile group: 'org.bytedeco', name: 'javacv', version: '0.9'}

2.编辑:对不起,我之前发布的解决方案只提到了上面的一行是错误的。但我亲自测试过,下面的方法对我有效:

a)添加依赖项

dependencies {
    compile group: 'org.bytedeco', name: 'javacv', version: '0.9'
    compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '2.4.9-0.9', classifier:    'android-arm'
    compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.3-0.9', classifier: 'android-arm'    
}

b) 在您的项目中创建jniLibs目录(与常规libs目录在同一级别。编辑:如果您遇到问题,请将jniLibs移动到app / src / main)。
c)将从opencv-android-arm.jar和ffmpeg-android-arm.jar中提取的所需.so文件(或仅实际需要的文件)添加到创建的jniLibs目录中。(如果您不知道我在说什么,您可以从JavaCV页面下载javacv-0.9-bin.zip,在其中找到这2个 .jars文件)。


不起作用。有步骤缺失吗?或者这个命令是所有魔法吗? - Moonlit
1
是的,你说得对,我的回答没有涵盖我们所需要的全部内容。但现在应该是正确的(希望如此... :) ) - Mkr
1
我需要申请a、b和c吗?只申请a)似乎就足够了。 - vfcosta
在c)中,我提到:“或者只选择你真正需要的文件” :P。我的说法不够准确,抱歉;) - Mkr
启用gradle插件和使用类似选项a)的依赖项后,我遇到了“复制重复文件”的问题。应用选项b)和c)是目前唯一有效的解决方法。 - vfcosta
显示剩余3条评论

3
为了获得最新的解决方案(JavaCV 1.1和Android Studio 2.1.1),请查看我的Gist中的按步骤说明。目前JavaCV 1.2不支持Android 6。本教程使用JavaCV 1.1,版本1.2目前存在SIGSEGV问题。JavaCV 1.1附带FFmpeg 2.8.1。 1.获取预编译二进制文件here。 2.将其解压并复制这些文件: javacpp.jar(必需)。 javacv.jar(必需)。 ffmpeg.jar(如果您使用FFmpeg,则必需)。 ffmpeg-android-arm.jar(针对arm CPU)。 ffmpeg-android-x86.jar(可选的x86 CPU) 到项目的libs文件夹中(在我的情况下为app / libs)。 3.单击app-> F4-> Dependencies-> +-> File dependencies->选择所有先前的.jar文件。 4.暂时需要在应用程序的build.gradle中设置targetSdkVersion 22,因为这个问题。 5.可能需要在build.gradle中设置这些packagingOptions: android { compileSdkVersion 23 buildToolsVersion "23.0.3"
defaultConfig {
    applicationId "com.example.test"
    minSdkVersion 16
    targetSdkVersion 22
    versionCode 1
    versionName "1.0"
}

packagingOptions {
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
    exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'

    //might need these if you use openCV
    //exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
    //exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
}

}


在Stack Overflow上不鼓励仅提供链接作为答案。请在您的回答中包含解决方案的关键部分。 - Raju
1
我的指南是针对JavaCV的。 - vxh.viet

1
很不幸,我在使用user2645214的解决方案时遇到了一些问题(仍然出现java.lang.UnsatisfiedLinkError),但是我找到了另一个解决方案,所以我决定与那些有同样问题的人分享。

自从发布0.7.3版本以来,有另一种方法可以包含*.so文件-您只需将它们放在/src/main/jniLibs中(如果没有,请创建jniLibs目录),它应该会起作用。

此外,我的build.gradle文件如下:

apply plugin: 'android'

repositories {
    mavenCentral()
    maven { url 'http://maven2.javacv.googlecode.com/git/' }
}

dependencies {
    compile 'com.android.support:appcompat-v7:20.+'
    compile 'com.googlecode.javacpp:javacpp:0.7'
    compile 'com.googlecode.javacv:javacv:0.7'
}

android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'

    defaultConfig {
        applicationId "com.example.agp.testapplication2"
        minSdkVersion 15
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

奇怪,这对我起作用了(但只能使用旧的JavaCV文件)。无论如何,现在我已经为最新的JavaCV版本添加了正确的解决方案。 - Mkr

1
我在Windows 7 x64上遇到了这个问题。 以下是我的gradle.build文件中解决该问题的部分内容:
compile("org.bytedeco:javacv:0.11")
compile("org.bytedeco.javacpp-presets:opencv:2.4.11-0.11:windows-x86_64")
compile("org.bytedeco.javacpp-presets:ffmpeg:2.6.1-0.11:windows-x86_64")

0
如果你尝试使用javacv 1.2,我们需要执行一些额外的步骤才能让它正常工作。这是我的build.gradle文件。
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"

    defaultConfig {
        applicationId "org.audiorecording"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.properties'
        exclude 'META-INF/maven/org.bytedeco.javacpp-presets/ffmpeg/pom.xml'

        //might need these if you use openCV
        exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.properties'
        exclude 'META-INF/maven/org.bytedeco.javacpp-presets/opencv/pom.xml'
    }
}

repositories {
    mavenCentral()
}

configurations {
    all*.exclude group: 'org.bytedeco', module: 'javacpp-presets'
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile 'com.android.support:design:24.2.1'
    compile 'org.bytedeco:javacv:1.2'
    compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.1.0-1.2', classifier: 'android-arm'
    compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '3.0.2-1.2', classifier: 'android-arm'

}

0

编辑。本帖中的解决方案已过时,可能包含一些错误。请查看页面底部最近的正确帖子。

好的,我自己做到了:)。所以这里是我们应该在Android Studio中使用JavaCV的方法:

1)首先,我们应该在项目的build.gradle中添加这些依赖项:

dependencies {
    compile group: 'com.googlecode.javacpp', name: 'javacpp', version: '0.7'
    compile group: 'com.googlecode.javacv', name: 'javacv', version: '0.7'}

(我的意思是:在我们的模块目录中构建build.gradle)

感谢我们在外部库中获得了javacv.jar和javacpp.jar(如果没有,我们应该重新启动Android Studio)。

2) 如果我们按照Eclipse指示在javacv官方网站上进行操作,现在我们已经到了第4步:

直接从javacv-android-arm.jar、opencv-2.4.8-android-arm.jar和ffmpeg-2.1.1-android-arm.jar中提取所有*.so文件到新创建的“libs/armeabi”文件夹中,而不创建JAR文件中找到的任何子目录。

我们必须提取我们需要的所有*.so文件,但是我们应该以其他特殊方式将它们加入我们的项目:这里的第3个答案说了这个问题,但通常,我们应该:

  1. 创建新的“armeabi”目录
  2. 将有趣的.so文件放入“armeabi”目录中
  3. 创建armeabi.zip文件
  4. 将armeabi.zip文件扩展名更改为armeabi.jar
  5. 将armeabi.jar文件放入“libs”目录中
  6. 确保我们模块的build.gradle包含以下依赖项:
    compile fileTree(dir: 'libs', include: ['*.jar'])

3) 在Android Studio中享受您的OpenCV和JavaCv(别忘了添加)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

如果您想从/保存图像到SD卡中读取,请在AndroidManifest.xml中添加以下代码,并尝试感谢此操作,使您的项目正常工作)。

/////////////////////////////////////////////////////////
如果有什么问题,请在评论中写下来。


所以我有点困惑,这是关于如何设置的正确编辑响应还是你上面的回复? - CMOS
您可以在页面底部找到最新JavaCV版本0.9的正确答案。上面的帖子中的答案适用于旧版JavaCV 0.7和Android Studio < 0.73,当时您无法将本地.so文件放入jniLibs。 - Mkr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接