Opencv for Android实例讲解之二
来源:互联网 发布:全民奇迹源码 编辑:程序博客网 时间:2024/05/01 20:22
@Override public void onResume() { super.onResume(); OpenCVLoader. initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback); }
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库并也用相同的JAVA类OpenCV来引用本地库和接口函数的话,编译打包都能通过,不过实际运行时碰到调用本地函数,程序会按照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");
- Opencv for Android实例讲解之二
- Opencv for Android实例讲解之三
- Opencv for Android实例讲解之一
- 实例讲解EventBus for Android
- Android进阶(二十三)Android开发过程之实例讲解
- Android之AIDL实例讲解
- ACL权限实例讲解之基础二
- 手把手教你OPENCV FOR ANDROID 之二_ android开发环境搭建
- 手把手教你OPENCV FOR ANDROID 之二_ android开发环境搭建
- 手把手教你OPENCV FOR ANDROID 之二_ android开发环境搭建
- 手把手教你OPENCV FOR ANDROID 之二_ android开发环境搭建
- Android实例讲解之观察者模式
- UIPro实例讲解之QQ2014 UI模仿系列二
- Android&OpenCv之Android程序加载OpenCv库(二)
- opencv for python学习二之打开视频文件
- android jni实例讲解
- android jni实例讲解
- OpenCV学习之CvMat的用法详解及实例(二)
- python中实现字符串反转的几种方法
- pyhon学习笔记
- Ubuntu14.04 64位系统为firefox浏览器安装flashplayer
- Java读取Properties配置文件
- C语言中strcpy与memcpy函数实现与区别
- Opencv for Android实例讲解之二
- mysql软件安装困难请看
- 【Ubuntu】Language Support 中语言安装不上
- 关于运行时的方法使用:objc_setAssociatedObject
- 复杂数据类型
- HDU 2045 不容易系列之(3)—— LELE的RPG难题
- HDU1429 胜利大逃亡(续) BFS +简单状压
- PCLint使用介绍
- gdi+ 快速绘制透明窗口