@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;
}
}
};
@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库并也用相同的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) {
@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");