Android + OpenCV搭建灰度化应用
分类:
文章
•
2025-03-12 12:23:27
Android应用开发之JNI源代码开发
- so文件:shared object,仅在运行时被加载,当使用C++进行开发时,在Andoird中以动态链接库输出的形式即为.so文件。因此,.so即为JAVA调用C++代码的一个中间件。当我们将.so文件放入工程时,JAVA代码就会在运行时加载这个native库,并通过JNI调用了它的方法。
- JNI: java native interface,因此,当使用JNI开发时,就是在开发一个.so文件,因此JNI开发的核心是生成和使用so文件的过程
- Android中的build.gradle文件主要用于配置软件版本信息、引用库的配置,以及编译所需的配置。
- 安卓中每一个module下都含有一个build.gradle, 其中第一句就是apply plugin:来指定这个文件夹是library,还是application:
application的gradle主要指定当前flavor所生成apk的包名,签名,apk文件名,编译sdk版本,versionName/code,以及dependencies(依赖库)等等
library的gradle主要指定改library的编译sdk版本号,以及依赖库等;
- 新建opencvlib文件夹,编写CMakeLists.txt文件及nativelib.cpp文件,使用cmake编译,生成libnativelib.so动态链接文件
JAVA调用生成的so文件
- 版本信息: Android Studio 3.6RC3, opencv 4.3.0, ‘com.android.tools.build:gradle:3.6.0-rc03’, compileSDKVersion: 28, buildToolsVersion “30.0.2”, NDK版本 20.0.5594570
- 参考文档
- 新建module,选择android library,名称为opencvlib。上述参考文档中的内容简单分为下述几个步骤
a. 将OpenCV库中的库文件、头文件拷贝到当前工程中。将“OpenCV-android-sdk\sdk\native\libs”下的文件复制到opencvlib/libs;opencvlib/src/main下新建文件夹cpp,cpp下新建C++文件native-lib.cpp;
将“OpenCV-android-sdk\sdk\native\jni”下的整个include文件夹复制到cpp文件夹下
b. 使用CMake进行配置。opencvlib目录下新建文件CMakeLists.txt。其中,CMakeLists.txt中,从a步骤中的各个对应文件夹中加载对应opencv相关的so,头文件。编写自己的库文件,以SHARED方式输出.so文件。
c. 配置当前module的build.gradle:主要是添加与JNI相关的配置externalNativeBuild(配置cmake的CMakelIsts.txt文件位置和相应cmake配置)和ndk信息
d. 编写native-lib.cpp文件: 此时会使用extern "C"方式直接进行C语言下的函数,此时构建的函数为JAVA_包名_opencvlib_OpenCVUtil_grey函数
e. 编写JNI工具类:此时,即为在opencvlib module的java目录下,新建OpenCVUtil.java文件。在这个类中写函数private static native int[]grey(int[] pixels_, int width, int height);此时,会调用native-lib.cpp文件中的JAVA_包名_opencvlib_OpenCVUtil_grey函数。完成JNI调用。注意,此时需要
static {
System.loadLibrary(“native-lib”);
System.loadLibrary(“opencv_java4”);
}来加载cmake生成的两个文件
f. app模块中引用opencvlib这个module:引入opencvlib库,调用里面写的grey函数即可
使用效果
- 经过直接生成opencvlib这个库,在使用opencv时,就不显示需要下载opencv manager的提示了!!赞!
- 此时做的功能是使用了opencvlib中的grey灰度化,并且加了两个按钮来显示
- 原始:
- 灰度化以后: