2013-05-13 82 views
0

我做了一個Opencv的應用程序窗口,現在我正在使用JNI將此代碼轉換爲Android,但我有一些問題。 具體而言,我的本地代碼不會做任何事情。JNI,C++問題

這是我的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,但功能檢測不正常,因爲當我使用這個,如果返回0.

回答

0

framedetect 0?我做了一個基於這個測試的應用程序,它工作得很好(就是說,jlong​​被轉換成和從罰款,所以這不應該是問題)。

嘗試使用ndk-gdb捕捉錯誤以更好地理解問題。附加到進程可能是一個問題,但如果它立即崩潰,那麼我喜歡在崩潰前在java端放置斷點,使用調試器在那裏暫停執行,附加ndk-gdb並繼續讓java進程繼續。

另外我建議使用reinterpret_cast<jlong>reinterpret_cast<variables*>而不是C風格轉換,並將轉換結果保存到單獨的變量以避免始終投射!更清潔的代碼