【OpenCV for Android】Android Studio JNI和NDK配置及採坑記錄

在配置好Android studio的OpenCV環境後,咱們就能夠經過Java代碼調用OpenCV的API了,可是在一般狀況下,用Java代碼編寫圖像處理算法的運行效率是沒有C++代碼高的,在應用層使用Java處理圖像耗時很是長,每每達不到想要的效果,而Android的NDK和Java的JNI剛好知足了Android移動端對C++編程的支持,在應用層和原生層起到橋樑的做用。html

JNI和NDK

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

下載NDK

1. 在官網下載NDK r16b版本的安裝壓縮包,下載地址:https://dl.google.com/android/repository/android-ndk-r16b-windows-x86_64.zipc++

2. 下載後解壓,相關文件以下:算法

導入NDK

打開Android Studio,點擊file-->project structure編程

點擊sdk location,選擇剛纔解壓的NDK文件的文件夾路徑,點擊OK便可。windows

在工程中添加JNI

方式一:新建工程,勾選include C++ supportapp

方式二:在已有工程中添加JNIide

1. 在已有的工程中建立cpp文件夾。工具

app/src/main/下建立cpp目錄,並在此目錄下添加cpp文件,文件名爲native-lib.cppcpp文件使用了android 建立cmake項目時的默認demo文件gradle

2. 建立CMakeLists.txt文件,在app/目錄下建立CMakeLists.txt文件,並在cmakeList.txt 文件添加編譯描述。 

3. 修改appbuild.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();
}

提示沒法找到so

1.提示找不到編譯以後的native-libso文件,即未編譯,

解決方法:

1)在app.gradle中添加以下代碼,而後從新編譯工程,若不起做用,則繼續執行(2)。

2)將libs文件夾下的文件除armeabi-v7a外所有刪除,而後從新編譯工程,build文件夾則會生成相應的so文件。

OpenCV環境配置

在網上查了不少資料,有的配置方法須要添加Android.mkApplication.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文件夾下添加其餘cpp文件時,Android Studio會顯示以下提示,

android studio :The file is not part of the project.Please include it ...

解決方法:打開CMakeLists.txt文件,在add_library中添加新的cpp文件和頭文件的名稱,以下,

 

點擊sync now,則提示語句消失,代碼編譯成功。

 

error: cannot use typeid with -fno-rtti

出現這個錯誤是由於AS關閉了RTTIRuntime Type Information Support)的支持。

解決辦法:打開build.gradle文件,在cppFlags中添加-frtti標識,Gradle 會將其傳遞到 CMake,錯誤便可消除。

error: cannot use 'try' with exceptions disablederror: cannot use 'throw' with exceptions disabled

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

相關文章
相關標籤/搜索