【问题标题】:JavaCV + Android Studio + gradle- possible?JavaCV + Android Studio + gradle- 可能吗?
【发布时间】:2014-01-20 07:46:39
【问题描述】:

我正在尝试将 JavaCV 与 Android Studio 和 Gradle 一起使用。我写了这样的代码片段:

   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'
}

我在 dir External Libraries 中看到导入的库。所以我尝试运行这个:

...
  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呢?

【问题讨论】:

    标签: android opencv android-studio javacv


    【解决方案1】:

    1.警告: 这还不够!

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

    2.EDIT:对不起,我最近的解决方案是 我在这里发帖,只告诉上面的行是错误的。但我检查了一下,这对我有用:

    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 目录(与普通库目录处于同一级别。编辑:如果 你有一些麻烦尝试将 jniLibs 移动到 app/src/main)。
    c) 添加从 opencv-android-arm.jar 和 ffmpeg-android-arm.jar 提取的所需 .so 文件(或仅您真正需要的这些文件)到创建的 jniLibs 目录。 (如果你不知道什么 我在说你可以从JavaCV page 下载 javacv-0.9-bin.zip 并在里面 你可以找到这 2 个 .jars)。

    【讨论】:

    • 不起作用。是不是少了一个步骤?还是这个命令所有的魔法?
    • 是的,你是对的,我的回答并没有说明我们需要什么。但现在它是正确的(我希望如此...... :))
    • 对我来说,'jniLibs' 目录需要在 app/src/main 中
    • 我检查了两个选项:在 app/src/main 内部和外部,对我来说在这两种情况下都运行良好。但我添加了有关您的解决方案的信息。
    • 我需要申请a、b和c吗?只应用 a) 似乎就足够了。
    【解决方案2】:

    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’
    

    【讨论】:

      【解决方案3】:

      有关最新的解决方案(JavaCV 1.1 和 Android Studio 2.1.1),请参阅我的Gist 中的分步说明。 JavaCV 1.2 目前不喜欢 Android 6。

      本教程将使用 JavaCV 1.1,版本 1.2 目前有 SIGSEGV issue。 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. 由于this issue的原因,暂时需要设置targetSdkVersion 22应用的build.gradle
      5. 可能需要在build.gradle中设置这些packagingOptions

      机器人{ 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'
      }
      

      }

      【讨论】:

      • 仅链接在 stackoverflow 上不鼓励的答案。请在这篇文章中包含解决方案的重要部分
      • 我的指南适用于 JavaCV。
      【解决方案4】:

      不幸的是,我在 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 版本添加了正确的解决方案。
      【解决方案5】:

      我在 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")
      

      【讨论】:

        【解决方案6】:

        编辑。这篇文章中的解决方案已被弃用,并且可能包含一些错误。请在页面底部查看最近的正确帖子。

        好的,我自己做的:)。下面是在 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 official site 我们现在在第 4 点:

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

        我们必须提取我们需要的所有 *.so 文件,但是我们应该以其他特殊方式将它们加入我们的项目: 3rd answer here says about it, 但一般来说,我们应该:

        1. 创建新的“armeabi”目录
        2. 将有趣的.so文件放入'armeabi'目录
        3. 创建 armeabi.zip
        4. 将 armeabi.zip 的扩展名更改为 armeabi.jar
        5. 将 armeabi.jar 放到“libs”目录中
        6. 确保我们模块的 build.gradle 包含这样的依赖:
          编译 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" />
        

        如果您想从/向 sdcard 读取/保存图像并尝试将图像保存到您的 AndroidManifest.xml,请尝试感谢这一点, 你的项目运行良好)。

        /////////////////////////////////////// //////////
        如果有问题,请写在 cmets 中。

        【讨论】:

        • 所以我很困惑这是关于如何获得此设置的已编辑正确回复还是您在上面的回复?
        • 您可以在页面底部“勾选”找到最新 JavaCV 0.9 版的正确答案。上面帖子中的答案(至少对我而言)是 JavaCV 0.7 和 Android Studio
        【解决方案7】:

        如果您尝试使用 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'
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-02
          • 2017-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多