【问题标题】:Problems with JNI and C++JNI 和 C++ 的问题
【发布时间】:2013-05-06 16:18:05
【问题描述】:

我在 windows 上做了一个 Opencv 的应用程序,现在我正在使用 JNI 将此代码转换为 Android,但我遇到了一些问题。 具体来说,我的本机代码什么都不做。

这是我定义本地方法的 Java 类:

package com.example.telo3;

import org.opencv.core.Mat;

public class Process {

    static {
        System.loadLibrary("nativo");
    }

    public Process(){

        dir=inicializar_nativo();
    }

    public void Procesar(Mat framedetect, Mat framedraw){

        procesar_nativo(dir,framedetect.getNativeObjAddr(),framedraw.getNativeObjAddr());
    }


    private long dir;
    private static native long inicializar_nativo();
    private static native void procesar_nativo(long thiz, long framedetect, long framedraw);

}

这是我的 JNI 代码:

#include "nativo.h"
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "opencv2/video/tracking.hpp"

#include <iostream>
#include <stdio.h>
#include "FaceDetector.h"
#include "Draw.h"
#include "Almacena.h"
#include "Runnable.h"



using namespace std;
using namespace cv;

#include <android/log.h>

#define LOG_TAG "NATIVO"
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))

struct variables {
    Almacena almacena;
    Draw draw;
    FaceDetector face_detector;
};

JNIEXPORT jlong JNICALL Java_com_example_telo3_Process_inicializar_1nativo(
        JNIEnv *, jobject) {

    long dir = (long) new variables();

    return (dir);


}

JNIEXPORT void JNICALL Java_com_example_telo3_Process_procesar_1nativo(JNIEnv *,
        jobject, jlong dir, jlong framedetect, jlong framedraw) {



Mat* telo =(Mat*)framedetect;
Mat* telo2= (Mat*)framedraw;

((variables*)dir)->almacena = ((variables*)dir)->face_detector.Detect(*telo);


 //almacena = face_detector.Detect(frame_gray);


 ((variables*)dir)->draw.Dibujar(*telo2,((variables*)dir)->almacena);


 //frame_capturado = draw.Dibujar(frame_capturado, almacena);



if( (((variables*)dir)->almacena.get_faces()).size() ==0){

    LOGD("no detecto caras");
}


}

我认为我正确使用了 Jni,但函数 Detect 无法正常工作,因为当我使用它时,如果返回 0。

【问题讨论】:

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


    【解决方案1】:

    对我来说似乎是一个简单的错字。

    您的包是“com.example.telo3”
    您的课程是“流程”
    你的函数是“initializar_nativo()”

    所以c++函数必须声明为

    JNIEXPORT jlong JNICALL Java_com_example_telo3_Process_inicializar_nativo(...)
    

    您已将其声明为

    JNIEXPORT jlong JNICALL Java_com_example_telo3_Process_inicializar_1nativo(...)
    

    您是否收到不满意的链接异常或类似情况?

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 2019-10-16
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多