在配置好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