【问题标题】:How to compile OpenCV native using jni calls in Android如何在 Android 中使用 jni 调用编译 OpenCV 本机
【发布时间】:2016-07-15 09:08:13
【问题描述】:

我是使用 Android 和 JNI 调用的新手。我已经使用 OpenCV 用 C++ 制作了一个简单的算法来检测人脸。 现在要对 Android 做同样的事情,我想从 Java 调用用 C++ 制作的算法。 问题是当我尝试编译 OpenCV 本机时,Gradle build 说:“错误:opencv2/opencv.hpp:没有这样的文件或目录” 我无法从本机 OpenCV 编译头文件。

这是我的 Android.mk 文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


# OpenCV
OPENCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=on
OPENCV_LIB_TYPE:=SHARED

include <path_to_android_OpenCV>/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk

LOCAL_MODULE := opencvjni
LOCAL_CFLAGS := -I<path_to_android_OpenCV>/OpenCV-android-sdk/sdk/native/jni/include -Wall -Werror
LOCAL_SRC_FILES := openCVJNI.c detect_face.cpp

LOCAL_C_INCLUDES += <path_to_project>/app/src/main/jni
LOCAL_C_INCLUDES += <path_to_android_OpenCV>/OpenCV-android-sdk/sdk/native/jni/include

LOCAL_STATIC_LIBRARIES := <path_to_android_OpenCV>/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/*.a

LOCAL_LDLIBS += -llog -ldl

include $(BUILD_SHARED_LIBRARY)

这是我的 Application.mk:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-8

这就是我的 gradle.build:

apply plugin: 'com.android.model.application'

model {
  android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        minSdkVersion.apiLevel 22
        targetSdkVersion.apiLevel 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles.add(file('proguard-android.txt'))
        }
    }
    ndk {
        moduleName "openCVJNI"
        cppFlags.add("-std=c++11") // Add provisions to allow C++11 functionality
        cppFlags.add("-fexceptions")
        stl = "gnustl_shared"
    }
    task ndkBuild(type: Exec) {
        commandLine '<_path_to_NDK>/ndk-bundle/build/ndk-build', '-C', file('app/src/main/jni').absolutePath
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
  }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'com.android.support:design:23.0.0'
}

如果有人可以帮助我,不胜感激。我对此感到害怕。

谢谢!

【问题讨论】:

    标签: java c++ opencv android-ndk java-native-interface


    【解决方案1】:

    https://developer.android.com/ndk/guides/android_mk.html

    在下面的链接中,它在 LOCAL_C_INCLUDES 部分下被提及:

    在设置任何相应的包含标志之前定义此变量 通过 LOCAL_CFLAGS 或 LOCAL_CPPFLAGS。

    【讨论】:

    • 不工作。有人在android中包含opencv本机文件吗?我做过的最糟糕的任务。
    • 您已经构建了 opencv 本机库 (*.a)。删除“include OpenCV.mk”部分并重试。
    • 我正在使用 gradle experimental 0.7.2,但我无法在 jni 中包含 opencv 标头。你有任何例子或教程来解释如何做到这一点?感谢您的耐心和关注。
    • 我不熟悉ndk-build,我使用自定义构建系统和cmake,我可以提供更多关于opencv+cmake的信息
    猜你喜欢
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多