Question

I run android application in eclipse with using opencv. My java class:

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();
        }
    }

My 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)

On all the lines where I am using opencv, I am getting the error: Caused by: java.lang.NoClassDefFoundError: org.opencv.core.Core

What's am I doing wrong?

P.S. Something strange: when I comment line System.loadLibrary( Core.NATIVE_LIBRARY_NAME ), program fails in Highguiclass and not in the Mat class.

Était-ce utile?

La solution

You should begin any opencv related operations after
onManagerConnected is called. So your initialization should be maved from onCreate to 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;
        }
    }
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top