在eclipse android应用程序中使用opencv

时间:2014-05-10 15:39:33

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

我使用opencv在eclipse中运行android应用程序。 我的java类:

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

    static
    {
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        CPlusPlusWrapper wrapper = new CPlusPlusWrapper();          
        Mat src = Highgui.imread("C:\\Users\\User1\\Desktop\\4.jpg");
        Mat dst = null;
        wrapper.Test(src.getNativeObjAddr(), dst.getNativeObjAddr());

        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                    .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }

我的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=STATIC
include C:\OpenCV-2.4.8-android-sdk\sdk\native\jni\OpenCV.mk

LOCAL_MODULE    := CPlusPlusLibrary
LOCAL_SRC_FILES := CPlusPlusLibrary.cpp
LOCAL_LDLIBS +=  -llog -ldl

include $(BUILD_SHARED_LIBRARY)

在我使用opencv的所有行中,我收到错误: Caused by: java.lang.NoClassDefFoundError: org.opencv.core.Core

我做错了什么?

P.S。奇怪的是:当我评论第System.loadLibrary( Core.NATIVE_LIBRARY_NAME )行时,程序在Highguiclass中失败而在Mat类中失败。

1 个答案:

答案 0 :(得分:0)

你应该在以后开始任何与opencv相关的操作 调用onManagerConnected。因此,您的初始化应该从onCreate到onManagerConnected。

@Override
public void onResume()
{
    super.onResume();
    if (!InitDone)
    {
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_7, this, mLoaderCallback);
        InitDone = true;
    }
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this)
{
    @Override
    public void onManagerConnected(int status)
    {
        switch (status)
        {
        case LoaderCallbackInterface.SUCCESS:
        {
            Log.i(TAG, "OpenCV loaded successfully");

            // Load native library after(!) OpenCV initialization
             System.loadLibrary("CPlusPlusLibrary");


            // your code here....



            break;              
        }

        default:
        {
            super.onManagerConnected(status);
        }
            break;
        }
    }
};