Opencv for Android实例讲解之二

注意:
1.
@Override
    public void onResume()
    {
        super.onResume();
        OpenCVLoader. initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }


在每个应用中都进行这样的初始化。
2.
         
 private BaseLoaderCallback baseLoaderCallback = new BaseLoaderCallback(this)
         {
//在调用这个方法之前是不允许调用和加载 OpenCV本地库的。
                    @Override
                    public void onManagerConnected( int status)
                   {
                             switch(status)
                            {
                                      case BaseLoaderCallback. SUCCESS:
                                     {
                                               Log. i("Detect", "成功!" );
                                     }
                                      break;
                                      default:
                                     {
                                                super.onManagerConnected(status);
                                     }
                                      break;
                            }                          
                   }
         };
         
          @Override
protected void onResume()
         {
                   Log.i("Detect", "Called onresume");
                   super.onResume();
                  
                   Log.i("Detect", "Trying to load OpenCV library");
                   if(!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, baseLoaderCallback))
                   {
                            Log.i("Detect", "Load failed!");
                   }                
}

在初始化结束之后调用这个方法。而且在调用这个方法之前是不允许调用和加载OpenCV本地库的。

unsatisfiedlinkederror,显示无法调用本地方法。按照文档上的操作有问题啊,应该就是库文件没有加载进来啊!!

一般使用jni编程时会出现这样得问题,主要原因就是.so库文件没有加载成功。

有网友遇到这样得问题时,是这样解决得:

问题已解决;问题出在本地函数的命名上面:
工程A的包为erlangxiong.opencv.aa,引用本地函数JAVA类为OpenCV的话,jni接口本地函数命名为像JAVA_erlangxiong_opencv_aa_Opencv_fun();也是编译出来的so库文件中的本地接口全名;
而工程B中若我们直接加入编译好的so库并也用相同的JAVAOpenCV来引用本地库和接口函数的话,编译打包都能通过,不过实际运行时碰到调用本地函数,程序会按照JAVA_erlangxiong_opencv_bb_Opencv_fun();来寻找so库中的函数,当然就寻找不到了。
我的做法是:
1
 修改jni接口文件中的本地函数函数名为对应B工程的包和类;
2
 重新用NDK-bulid编译,生成新的so
3 so
库加入libs/armbe
4
 编译、打包、安装程序,succeed!~
但是这样做的话感觉比较麻烦,启不是每个不同工程需要用库时都要重新编译了?
有没有其他办法解决呢?

还有就是加入下面这段代码:

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
@Override
public void onManrageConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
// Create and set View
// setContentView(R.layout.color_blob_detection_surface_view);
//loadimage();
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
Log.i(TAG, "Trying to load OpenCV library");
if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this,
mOpenCVCallBack)) {
Log.e(TAG, "Cannot connect to OpenCV Manager");
}
}

有人这样写的代码:

package com.example;
import org.opencv.core.Mat;
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroidActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Mat mat = new Mat(); //这里会报错!
    }}


有网友建议他加上上面的那段代码,但是他说是因为在调用库函数之前就定义了Mat:that is i have defined Mat m = new Mat(), before calling the library..so it gave the error..

解决办法就是必须要对OpenCV进行初始化。在org.opencv.android的包里的OpencvLoader类中的两个方法initDebug()&initAsync(String Version, Context AppContext,

            LoaderCallbackInterface Callback)

改进的方法是在添加System.loadLibrary("opencv_java");

如下所示:

if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_4, this,
				baseLoaderCallback)) {
			Log.i(TAG, "没有加载OpenCvManager");
		}

		System.loadLibrary("opencv_java");


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值