繁体   English   中英

Android Studio 1.3 NDK无法解析C ++标头/代码

[英]Android studio 1.3 NDK cannot resolve c++ header / code

我使用Android Studio 1.3.2相当新,使用NDK甚至更多。 我正在尝试使用OpenCV 2.4.11和C ++。 我正在使用Gradle 2.6。

到目前为止,奇怪的是,OpenCV不会在C ++代码中产生任何错误。 仅当我包括C ++头文件或时,它无法解析它们。 未解决的Try ... Catch也是如此。 同样,我在2周前开始使用Android Studio,而在1周前开始使用NDK。 我仍然不确定自己在做什么。

#include "jni.h"
#include <vector>
#include <string>
#include <opencv2/contrib/contrib.hpp>

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jlong JNICALL Java_face_rt_facert_FisherFaceRecognizer_createFisherFaceRecognizer_10(JNIEnv *env,
                                                                         jclass type) {

try {
    cv::Ptr<cv::FaceRecognizer> pfr = cv::createFisherFaceRecognizer();
    pfr.addref(); // this is for the 2.4 branch, 3.0 would need a different treatment here
    return (jlong) pfr.obj;
     } catch (...) {
    jclass je = env->FindClass("java/lang/Exception");
    env->ThrowNew(je, "sorry, dave..");
    }
    return 0;
}

#ifdef __cplusplus
}
#endif

我的build.gradle文件的项目:

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

model {
android {
    compileSdkVersion = 23
    buildToolsVersion = "23.0.1"

    defaultConfig.with {
        applicationId = "face.rt.facert"
        minSdkVersion.apiLevel = 19
        targetSdkVersion.apiLevel = 19
        versionCode = 1
        versionName = "1.0.1"
    }

}

android.buildTypes {
    release {
        minifyEnabled = false
        proguardFiles += file('proguard-rules.txt')
    }
}

android.ndk { // keeping it to make AS correctly support C++ code editing and debugging
    moduleName = "Face"
    ldLibs += ['log']
    cppFlags += "-std=c++11"
    cppFlags += "-fexceptions"
    cppFlags += "-I${file("src/main/jni/prebuilts/include")}".toString()
    cppFlags  += "-I${file("C:/Android-dev/SDKs/OpenCV-android-sdk/sdk/native/jni/include")}".toString()
    cppFlags  += "-I${file("C:/Android-dev/SDKs/OpenCV-android-sdk/sdk/native/jni/include/opencv")}".toString()
    cppFlags  += "-I${file("C:/Android-dev/SDKs/OpenCV-android-sdk/sdk/native/jni/include/opencv2")}".toString()
    stl = "gnustl_shared" //"stlport_static"
}


android.productFlavors {
    // for detailed abiFilter descriptions, refer to "Supported ABIs" @
    // https://developer.android.com/ndk/guides/abis.html#sa
    create("arm") {
        ndk.with {
            abiFilters += "armeabi"

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\armeabi\\" //"-L" +

            ldLibs += libsDir + "libnative_camera_r4.3.0.so"
            ldLibs += libsDir + "libopencv_contrib.a"
            ldLibs += libsDir + "libopencv_core.a"
            ldLibs += libsDir + "libopencv_highgui.a"
            ldLibs += libsDir + "libopencv_imgproc.a"
            ldLibs += libsDir + "libopencv_info.so"
            ldLibs += libsDir + "libopencv_java.so"
            ldLibs += libsDir + "libopencv_legacy.a"
            ldLibs += libsDir + "libopencv_ml.a"
            ldLibs += libsDir + "libopencv_ts.a"

        }
    }
    create("armv7") {
        ndk.with {
            abiFilters += "armeabi-v7a"

            File curDir = file('./')
            curDir = file(curDir.absolutePath)
            String libsDir = curDir.absolutePath+"\\src\\main\\jniLibs\\armeabi-v7a\\" //"-L" +

            ldLibs += libsDir + "libnative_camera_r4.3.0.so"
            ldLibs += libsDir + "libopencv_contrib.a"
            ldLibs += libsDir + "libopencv_core.a"
            ldLibs += libsDir + "libopencv_highgui.a"
            ldLibs += libsDir + "libopencv_imgproc.a"
            ldLibs += libsDir + "libopencv_info.so"
            ldLibs += libsDir + "libopencv_java.so"
            ldLibs += libsDir + "libopencv_legacy.a"
            ldLibs += libsDir + "libopencv_ml.a"
            ldLibs += libsDir + "libopencv_ts.a"

        }
    }
    create("x86") {
        ndk.with {
            abiFilters += "x86"
        }
    }
    create("mips") {
        ndk.with {
            abiFilters += "mips"
        }
    }
    create("fat") {

    }

    // To include all cpu architectures, leaves abiFilters empty
    create("all")
}
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile project(':openCVLibrary2411')
}

这是我对项目的依赖:

classpath 'com.android.tools.build:gradle-experimental:0.3.0-alpha3'

编辑:

从功能中删除了Try ... Catch以进行测试。 奇怪的是,向量和字符串标头现在已解决并且可以工作。

但是现在在编译时我收到的关于OpenCV的错误很少。

错误:(16)对`cv :: createFisherFaceRecognizer(int,double)的未定义引用

错误:(2607)对“ cv :: fastFree(void *)”的未定义引用

错误:任务':app:linkArm64-v8aDebugAllFaceSharedLibrary'的执行失败。 生成操作失败。 链接libFace.so时,链接器失败。

我在build.gradle中找到了:

    // To include all cpu architectures, leaves abiFilters empty
    create("all")

全部表示32位和64位。 由于我的库只有32位,因此编译器找不到64位版本并失败了。

我删除了这一行,它的效果更好(仍然有一些错误,但没有编译错误)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM