当前位置: 移动技术网 > 移动技术>移动开发>Android > Android studio 中基于c++的OpenCV 配置

Android studio 中基于c++的OpenCV 配置

2020年07月27日  | 移动技术网移动技术  | 我要评论

Android studio 中基于c++的OpenCV 配置

最近在做文字识别的App,需要调用图像处理的c++代码,关于OpenCV的配置遇到很多坑,因此记录一下配置流程。

配置版本:Android studio:3.6.3(版本查看:Help–>About)
Opencv :4.1.2(Android版),下载后解压即可

若opencv版本不同也可以,但需要注意后续中配置进行相应更改。

1.新建Native C++工程
File–>New–>New Project,选择Native C++;
在这里插入图片描述
2.导入opencv
选择File --> New -->Import Module,导入刚刚解压的opencv-4.1.2-android-sdk,选择OpenCV-android-sdk\sdk\java.
在这里插入图片描述
3.修改build.gradle (opencv)
将文件中的 ‘application’ 改为‘library’ ,将defaultConfig中的“applicationId” org.opencv ”一行 删除;(如果是opencv3就不需要更改,自动生成library)
在这里插入图片描述
4.build.gradle (: app) 和build.gradle (: opencv)修改
两个文件中的 compileSdkVersion和build ToolsVersion 需要保持一致
在这里插入图片描述
5.将opencv作为dependencies加到app中
选择File --> Project Structure --> Dependencies,选择app后点+号,选择opencv
在这里插入图片描述
6.在src/main/下新建JNI Folder
文件名为jniLibs,并将D:\soft\opencv-4.1.2-android-sdk\OpenCV-android-sdk\sdk \ native \ libs下的四个文件复制过去(opencv3版本也是复制下图的四个文件)
在这里插入图片描述
结果如下图所示
在这里插入图片描述
7.修改gradle.properties文件
加入opencv的路径

opencvsdk=D\:/soft/opencv-4.2.1-android-sdk/OpenCV-android-sdk

在这里插入图片描述

8.修改 Settings.gradle文件
添加如下内容,project中的内容为导入opencv时的命名。

include ':opencv4'
project(':opencv4').projectDir = new File(opencvsdk + '/sdk')

9.修改Build.gradle(:app)文件
在externalNativeBuild中添加如下内容:

externalNativeBuild {
cmake {
	cppFlags "-frtti -fexceptions"
	abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
	arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native"
   }
}

结果如下图
在这里插入图片描述
修改sourceSets部分如下:
在这里插入图片描述

10. 修改CMakeList.txt文件
在add_library上面添加如下内容:
opencv4版本

include_directories(${OpenCV_DIR}/jni/include)
add_library( lib_opencv SHARED IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java4.so)

opencv3版本

include_directories(${OpenCV_DIR}/jni/include)
add_library( lib_opencv SHARED IMPORTED )
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${OpenCV_DIR}/libs/${ANDROID_ABI}/libopencv_java3.so)

在target_link_libraries加入lib_opencv
在这里插入图片描述
11.测试代码

Native-lib.cpp

#include <jni.h>
#include <string>
#include <opencv2/core.hpp>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_test_MainActivity_opencvTest(JNIEnv *env, jobject thiz, jlong mad_addr_gr,jlong mat_addr_rgba) {
    cv::Rect();
    cv::Mat();
    std::string hello2="hello from opencvtest";
    return env->NewStringUTF(hello2.c_str());
    // TODO: implement validate()
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_test_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz) {
    // TODO: implement stringFromJNI()
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

12.MainActiviy.java代码

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.opencv.android.OpenCVLoader;

public class MainActivity extends AppCompatActivity {

            private static String TAG="MainActivity";
            static {
                System.loadLibrary("native-lib");
                System.loadLibrary("opencv_java4");//opencv4版本
                //System.loadLibrary("opencv_java3");opencv3版本
            }

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                TextView textView=(TextView) findViewById(R.id.sample_text);
                textView.setText(stringFromJNI());

                // Example of a call to a native method
                TextView tv = findViewById(R.id.sample_text);
                tv.setText(stringFromJNI());

        if (OpenCVLoader.initDebug()) {
            textView.setText(textView.getText()+"\n OPENCV LOADED SUCCESSFULLY");
            textView.setText(textView.getText()+"\n"+validate(500,500));

        } else {
            Log.d(TAG, "OPENCV DİD NOT LOAD");

        }
    }
    public native String stringFromJNI();
    public native String opencvTest(long madAddrGr,long matAddrRgba);
}

测试结果如下:
在这里插入图片描述
ps:opencv3版需要用NDK16,具体原因暂时不知。

若有错误请指正。

本文地址:https://blog.csdn.net/qq_42881467/article/details/107567570

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网