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.

Was it helpful?

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;
        }
    }
};
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top