1. 程式人生 > >android NDK整合opencv開發——流程總結(window環境)

android NDK整合opencv開發——流程總結(window環境)

使用opencv有兩種方式:

一種是使用opencv的java版本的API,但是這種方式不是通過本地呼叫實現的,全部都是java程式碼。

一種是使用opencv的c++版本的API,將本地c++程式碼編譯成.so連結庫,然後在安卓開發中進行呼叫,本地cpp程式碼使用NDK進行編譯。

這裡總結下面這種編譯本地c++程式碼的例項流程:

1、新建android專案,專案名稱命名為NDKdemo。

2、修改介面檔案res->layout->activity_ndkdemo.xml

3、在資料夾src下的com.example.ndkdemo包中新建一個類,類名為NdkFun。


這個類用於包裝使用了opencv c++程式碼的動態庫的匯出函式。


4、修改Ndkdemo.java的程式碼,主要編寫介面,以及呼叫上面的類(即使用C++動態庫)。

上面都是在android開發環境上的java程式碼。

5、在專案中新建一個jni檔案,用於放置該專案的所有cpp程式碼。


在jni資料夾下建立一個與動態庫相同名字的cpp檔案。

主要編寫功能實現,完成邏輯,C++程式碼。

6、然後再在jni下新建兩個檔案"Android.mk"檔案和"Application.mk"檔案,這兩個檔案事實上就是簡單的Makefile檔案。
使用NDK進行編譯的時候,需要使用Android.mk和Application.mk兩個檔案。


以上編寫C++程式碼,以及makefile檔案。

7、編譯本地C++程式碼

編譯本地C++程式碼可以使用Cygwin進行編譯,cd 到專案目錄,然後執行ndk-build。
也可以使用windows控制檯進行編譯,同樣cd到專案目錄,執行ndk-build。
還可以使用Eclipse進行編譯,建議配置使用Eclipse進行編譯,這樣當專案的本地cpp程式碼發生變化的時候就可以實現自動的cpp程式碼編譯,不用每次都在命令列中手動的進行編譯。

我們使用Eclipse進行編譯:
7.1首先需要將該專案轉換到C++專案,使得該專案具有C++程式碼屬性,如下所述。
點選專案,右擊,New -> Other -> C/C++ -> Convert to a C/C++ Project.

7.2配置Eclipse對cpp程式碼進行編譯:

首先需要給當前專案新增一個編譯環境變數,如下目錄
open Eclipse menu Window -> Preferences -> C/C++ -> Build -> Environment,
點選Add... 新增一個NDKROOT,並且設定值為NDK的根目錄。


然後設定編譯的一些引數
Project Properties -> C/C++ Build, uncheck Use default build command, replace “Build command” text from "make" to
"${NDKROOT}/ndk-build.cmd" on Windows,
"${NDKROOT}/ndk-build" on Linux and MacOS.


然後修改Behaviour選項卡,設定編譯配置(配置在儲存程式碼的時候進行自動編譯):


點選確定,然後確認NDK(ndk-build)編譯能夠正常進行編譯:


這個時候,會在C++程式碼中,看到非常多的錯誤提示,遍地都是錯誤提示,這裡不要慌,這裡只是假的錯誤提示,編譯cpp程式碼能夠編譯通過,但是執行程式是不行的,會提示你程式碼有錯誤,需要解決這些問題。

開啟工程屬性,Project Properties -> C/C++ General -> Paths and Symbols

為GNC C++編譯器新增如下路徑:這裡新增的路徑就是NDK 中的c/c++ 標頭檔案的路徑以及要讓專案找到opencv的jni的目錄,這樣才能使用opencv的c/c++ 對應的標頭檔案


終於可以執行程式了。