Android应用开发之JNI源代码开发
- so文件:shared object,仅在运行时被加载,当使用C++进行开发时,在Andoird中以动态链接库输出的形式即为.so文件。因此,.so即为JAVA调用C++代码的一个中间件。当我们将.so文件放入工程时,JAVA代码就会在运行时加载这个native库,并通过JNI调用了它的方法。
- NDK: native develop kit源开发工具,用于进行C/C++的开发。一般情况下,使用NDK工具把C/C++编译为.so文件,然后在JAVA中调用。
- JNI: java native interface即JAVA本地接口,上层通过JNI来调用NDK层,使用这个工具可以很方便的编写和调试JNI的代码。JNI是JAVA调用C++的规范。JNI可以实现
- Android系统支持7中不同的CPU架构,每一种对应着各自的应用程序二进制接口ABI,其定义了二进制文件如何在相应系统平台上运行。其中,包括,从使用的指令集,内存对齐到可用的系统函数库等。如ARMv5,ARMv7,ARMv8, X86, MIPS, MIPS64, X86_64.
- 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灰度化,并且加了两个按钮来显示
- 原始:
- 灰度化以后: