Opencv for Android实例讲解之二

来源:互联网 发布:全民奇迹源码 编辑:程序博客网 时间:2024/05/01 20:22
注意:
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;                            }                                             }         };                   @Overrideprotected 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) {@Overridepublic 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;}}};@Overridepublic 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");


0 0
原创粉丝点击