背景
现在越来越多应用包含一些第三方C/C++算法库, 比如图像处理, 人脸检测, 语音识别等等. 第三方提供的算法库都是C/C++动态库(.so), 不同的提供商提供的接口存在差异, 主要分为以下两种:
提供Java接口和so库
这种类型调用很简单, 把so库放到打包到apk或者Android系统中, 通过Java接口调用即可, JNI部分代码提供商都写好了.
只提供C/C++接口和so库
此类型调用稍微麻烦些, 需要自己写编译规则和JNI代码
由于一般算法库既可能集成在App中, 也有可能集成在Android系统中, 所以大部分算法提供商都是只提供C/C++接口, 这样就更省事, 只是在App集成稍微麻烦些,下面就讲一下这两种方式如何集成和调用.
App中调用C/C++算法库
由于提供的算法库中并没有JNI部分代码, 所以我们需要自己写JNI代码, 并在native方法中调用算法提供的接口, 最终会产生两个so库, 一个包含我们的native代码, 另一个就是算法库, 集成步骤如下:
1.编写JNI代码
这部分可参看资料很多, 本文不做介绍,直接略过,可参考我之前写的文章:Android JNI 函数注册的两种方式(静态注册/动态注册)
2.编写Android.mk和Application.mk
so库是通过NDK编译产生的, 我们需要编写编译规则,其中主要注意的有两点, 1. 算法商提供的so是以预置的方式(prebuild)进行编译的. 2.我们写的native代码也是编译成so文件, 并且要依赖于算法so库.
假设算法提供的so库名字为libalgo.so, 提供的头文件为algo.h, 可供调用的方法为 const char* getVersion(), 我们写的代码在test.cpp中 , jni目录结构如下:
jni
│─Android.mk
│─Application.mk
│─test.cpp
│
├─include
│── algo.h
│
├─lib
│── libalgo.so
Android.mk代码如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := algo
LOCAL_SRC_FILES := lib/libalgo.so
LOCAL_EXPORT_C_INCLUDES :&#