Android studio 中基于c++的OpenCV 配置
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
上一篇: uniapp 自定义原生tabbar样式
下一篇: 反射机制
推荐阅读
-
Android studio Kotlin中配置GRPC和protobuf时出现的一些问题总结
-
在Android Studio 3上搭建基于Tensorflow+OpenCV+JNI的Android应用(详细流程)
-
Android中为什么有些变量会以m开头?配置Android Studio识别成员变量的m前缀
-
理解与配置Android studio中的gradle
-
Android studio 中基于c++的OpenCV 配置
-
Android studio3.5.2配置OpenCV4.2.0 C++(OpenCV4版本都适用)及配置过程中产生的一些问题
-
Android studio Kotlin中配置GRPC和protobuf时出现的一些问题总结
-
在Android Studio 3上搭建基于Tensorflow+OpenCV+JNI的Android应用(详细流程)
-
给Mac中Xcode配置指定版本Opencv(C++),以及Xcode的摄像头权限问题
-
Android studio 中基于c++的OpenCV 配置