在配置好Android studio的OpenCV环境后,咱们就能够经过Java代码调用OpenCV的API了,可是在一般状况下,用Java代码编写图像处理算法的运行效率是没有C++代码高的,在应用层使用Java处理图像耗时很是长,每每达不到想要的效果,而Android的NDK和Java的JNI刚好知足了Android移动端对C++编程的支持,在应用层和原生层起到桥梁的做用。html
JNI是Java Native Interface的缩写
,即 Java
本地接口,其做用是提供若干API,使Java
能与本地其余类型语言(如C、C++
)交互。NDK是Native Development Kit的缩写
,是 Android
的一个工具开发包, 其做用是使开发者能快速开发C
、 C++
的动态库,并自动将so
和应用一块儿打包成 APK。有了这两样,咱们就能够经过NDK在Android中使用JNI与本地代码(C、C++)进行交互,将高耗时的图像算法使用C++代码实现,而后由Java应用层调用获得结果并展现。
android
1. 在官网下载NDK r16b版本的安装压缩包,下载地址:https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zipc++
2. 下载后解压,相关文件以下:算法
打开Android Studio,点击file-->project structure,编程
点击sdk location,选择刚才解压的NDK文件的文件夹路径,点击OK便可。windows
方式一:新建工程,勾选include C++ support,app
方式二:在已有工程中添加JNIide
1. 在已有的工程中建立cpp文件夹。工具
在app/src/main/下建立cpp目录,并在此目录下添加cpp文件,文件名为native-lib.cpp。cpp文件使用了android 建立cmake项目时的默认demo文件gradle
2. 建立CMakeLists.txt文件,在app/目录下建立CMakeLists.txt文件,并在cmakeList.txt 文件添加编译描述。
3. 修改app的build.gradle,在build.gradle中增长对Cmake的支持
4. 在Java中调用,
package www.edgematch.com.myjni; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends AppCompatActivity { // Used to load the 'native-lib' library on application startup. static { System.loadLibrary("native-lib"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Example of a call to a native method TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI()); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public native String stringFromJNI(); }
1.提示找不到编译以后的native-lib的so文件,即未编译,
解决方法:
(1)在app.gradle中添加以下代码,而后从新编译工程,若不起做用,则继续执行(2)。
(2)将libs文件夹下的文件除armeabi-v7a外所有删除,而后从新编译工程,build文件夹则会生成相应的so文件。
在网上查了不少资料,有的配置方法须要添加Android.mk和Application.mk文件什么的很是复杂,后来参考了https://www.jianshu.com/p/6e16c0429044 的作法,直接一步到位,不须要其余繁琐操做,咱们只须要在CMakeLists.txt中修改以下:红框中为设置为本身的OpenCV Android sdk路径。
# For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/studio/projects/add-native-code.html # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) # ##################### OpenCV 环境 ############################ #设置OpenCV-android-sdk路径 set( OpenCV_DIR E:/AndroidOpenCV/OpenCV-android-sdk/sdk/native/jni ) find_package(OpenCV REQUIRED ) if(OpenCV_FOUND) include_directories(${OpenCV_INCLUDE_DIRS}) message(STATUS "OpenCV library status:") message(STATUS " version: ${OpenCV_VERSION}") message(STATUS " libraries: ${OpenCV_LIBS}") message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}") else(OpenCV_FOUND) message(FATAL_ERROR "OpenCV library not found") endif(OpenCV_FOUND) # ###################### 项目原生模块 ########################### add_library( identify-lib SHARED src/main/cpp/identify-lib.cpp src/main/cpp/edgeGradientMatching.cpp src/main/cpp/OpenCVAndroidFunction.h) target_link_libraries( identify-lib ${OpenCV_LIBS} log jnigraphics)
接下来就能够在cpp文件中导入opencv头文件在c++代码中其API了。
咱们在cpp文件夹下添加其余cpp文件时,Android Studio会显示以下提示,
android studio :The file is not part of the project.Please include it ...
解决方法:打开CMakeLists.txt文件,在add_library中添加新的cpp文件和头文件的名称,以下,
点击sync now,则提示语句消失,代码编译成功。
出现这个错误是由于AS关闭了RTTI(Runtime Type Information Support)的支持。
解决办法:打开build.gradle文件,在cppFlags中添加-frtti标识,Gradle 会将其传递到 CMake,错误便可消除。
NDK编译错误,这是因为 CPP文件中使用了C++ 标准异常,而 Android NDK 编译器默认不支持 C++ 异常控制致使。在使用NDK13b 的时候报错,使用升级版本到NDK16b时,运行编译则不会出错,因此当出现这个错误时能够经过使用高版本的NDK解决。下载地址:https://developer.android.google.cn/ndk/downloads/older_releases
OK,万事俱备,接下来就能够愉快的写代码了。
转载请注明出处:https://www.cnblogs.com/White-xzx/p/9563555.html