2015-09-05 195 views
0

我已经在Android Studio中实现了这个项目:https://github.com/yaylas/AndroidFaceRecognizer。我使用教程包含OpenCV:https://www.youtube.com/watch?v=OTw_GIQNbD8(这是静态初始化)。而且,我在Android Studio设置中设置了适当的NDK位置。 问题是,如果我加入这个类:OpenCV + Android - 人脸识别不起作用

package com.yaylas.sytech.facerecognizer; 

import java.util.Vector; 

import org.opencv.core.Mat; 
import org.opencv.core.MatOfRect; 

import android.widget.Toast; 

public class DetectionBasedTracker 
{ 
    public DetectionBasedTracker(String cascadeName, int minFaceSize, boolean isFaceDetector) { 
     mNativeObj = nativeCreateObject(cascadeName, minFaceSize, isFaceDetector); 
    } 

    public long getNativeObj(){ 
     return mNativeObj; 
    } 

    public void setMinFaceSize(int size) { 
     nativeSetFaceSize(mNativeObj, size); 
    } 

    public void detect(Mat imageGray, MatOfRect faces) { 
     nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr()); 
    } 

    public void release() { 
     nativeDestroyObject(mNativeObj); 
     mNativeObj = 0; 
    } 
    public static Vector<Mat> imageVector = new Vector<Mat>(); 
    public static void addElement(Mat m){ 
     imageVector.add(m); 
     System.out.println("--------------------------------- elementAdded: "+imageVector.size()); 
    } 

    public static long getElementAt(int index){ 
     if(index >= imageVector.size() || index < 0){ 
      return 0; 
     } 

     System.out.println("-------------------------***** get element: "+imageVector.size()+" index: "+index); 
     return imageVector.elementAt(index).getNativeObjAddr(); 
    } 

    public static int getImageCount(){ 
     return imageVector.size(); 
    } 


    private long mNativeObj = 0; 

    private static native long nativeCreateObject(String cascadeName, int minFaceSize, boolean faceDetection); 
    private static native void nativeDestroyObject(long thiz); 
    private static native void nativeStart(long thiz); 
    private static native void nativeStop(long thiz); 
    private static native void nativeSetFaceSize(long thiz, int size); 
    private static native void nativeDetect(long thiz, long inputImage, long faces); 

} 

返回一个错误信息:

无法解析对应的JNI功能

我什么都试过,但错误依然存在。我想问问,哪里可以成为问题?

回答

0

运行时可能无法解析JNI函数有几个原因。测试这些假设:

  • 本机代码库没有捆绑到您的APK中。看看里面的APK。
  • 本机代码库位于APK的错误目录中。再次,看看。
  • Java类被ProGuard弄坏了,所以名称不再与本地库匹配。尝试关闭ProGuard。它应该关闭调试版本。
  • 如果您的本机代码库是为ARM编译的,但是您正在基于x86的Android模拟器中运行(反之亦然),则它将无法加载该库。
  • 想想更多的假设,然后测试它们。

页面http://opencv.org/platforms/android.html有很多关于Android上的OpenCV的信息,包括指向教程的链接。

+0

也许我可以找到metods/tutorial来整合JNI funcion在NDK OpenCV性质?我尝试这些要点,但我的程序仍然无法正常工作... – Pitter

+0

@Pitter我在Android上添加了OpenCV上的信息链接。该页面链接到晚餐教程。 – Jerry101