Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 基於Opencv的Android圖像處理(Eclipse和ndk)

基於Opencv的Android圖像處理(Eclipse和ndk)

編輯:關於Android編程

前段時間做了一個失敗的圖像處理項目,結果雖然不太好,也學到了不少東西,其中關於在Eclipse裡如何使用opencv的圖片處理api折騰了一陣子,記錄一下:

1、Android NDK 配置

其實opencv提供了一些基於android的庫,但是個人認為限制很多,需要裝個opencv manager應用作為基礎服務,而且感覺很多基礎類型和函數都沒有,可能我也不太熟悉,網上很多關於opencv的帖子都是關於C++的,所以最後還是決定使用ndk開發。

網上很多帖子說要配置Cygwin,其實根本不用,只要NDK用比較新的就可以了,r9以後就不需要配置Cygwin來編譯C++文件了,我開始用的是r9d後來換成相對新的r10了。

 

新建Android工程,然後新建jni文件夾,然後把工程轉成C++的,

在項目名稱上右鍵,選擇New,選擇other,然後輸入選擇Convert to a C/C++………………

\

\

 

Next,下一步選擇非常關鍵

左邊選擇Makefile project,然後在右邊選擇Other Toolchain,我之前配置cygwin,但是這裡根本不需要。這裡不能選錯,因為每個編譯工具Eclipse會自動拷貝一些windows系統裡的環境變量過來,會出各種奇葩的問題。

\

 

因為我已經轉過一次了,所以下面這個finish按鈕不讓點了,選擇完以後點擊finish即可。

轉完以後,打開cpp文件,這個時候如果cpp文件裡有c++代碼的話,肯定會報很多錯誤,一切都是正常的。

 

然後打開properties,選擇c/c++ build 下面的 Environment查看一下當前已有的環境變量

\

如果多了,就說明配置得不對,比如如果剛才錯選了Cygwin的GCC編譯環境,那這裡就會有顯示Cygwin的環境變量。然後點擊add,添加NDK環境變量,命名為NDKROOT,值設置為ndk的路徑,路徑不要太長,最好不要有中文

\

 

點擊ok後,選擇c/c++ build ,設置編譯命令,這裡要設置Builder setting裡面的Build command和勾選Behavior裡對應圖中的三個復選框,後面的命令都空著,不要填

\\

然後保存,選擇C/C++ General裡面的Path and Symbol,增加編譯C++所需要的Ndk裡面的頭文件

\

這裡,添加了ndk 的c++頭文件路徑和opencv sdk 的頭文件路徑,這五個路徑缺一不可,添加完以後,點擊apply,如果還是出現IplImage,jintArray等之類的無法識別的錯誤的話,就clean一下工程。

添加完了以後,Eclipse在cpp文件裡就不會識別不了jni.h,JNICALL之類的C++基礎的文件和標示符了,函數前面的JNICALL之類的無法識別的話,直接刪掉即可,不影響使用。

配置結束,然後在項目中寫cpp文件完成你需要的各種圖片處理功能即可

正常結果如下:Eclipse不會報錯,然後終端會顯示自動編譯生成了so庫文件

\

 

遇到的各種奇葩報錯記錄如下:

1、Eclipse提示找不到ndk-build.cmd

 

D:\android-ndk-r10\ndk-build.cmd系統找不到指定路徑

在Windows下面配置Eclipse裡面的ndk-build.cmd指令的時候,Ndk路徑也是對的,指定的目錄下也有對應的ndk-build.cmd文件,但是Eclipse提示找不到ndk-build.cmd文件,

在CMD下,cd到Ndk目錄下,運行ndk-build,也會提示提示找不到ndk-build.cmd文件,這個時候基本就可以確定,NDK的版本下錯了,肯定是NDK不是32位的,要下載32位的NDK,一般64位的NDK文件名都有x86_64,如下圖所示,第二個就是64位的,這樣解壓後32位的系統是認不出來的,必須用第一個帶了32和只有x86的壓縮包。

\

2、cbuf= env->GetIntArrayElements(buf, false); 報錯

這一行報錯, 提示如下,把false改成NULL即可

\

更正後如下:

\

 

3 報錯make.exe: *** No rule to make target`../../sdk/native/jni/OpenCV.mk'.

報錯截圖如下:

\

 

項目裡配置各種C++頭文件也都配置好了,但是還是報這個錯誤,這個錯誤時由於

Jni裡面的android.mk文件裡的配置路徑寫錯導致的,

\

 

 

改成opencv的opencv.mk文件的絕對路徑即可,路徑需要自己查看本機上opencv.mk的存放路徑,我的路徑如下:

\

把include的路徑修改成本地的絕對路徑,修改後如下:

\

 

復制windows的路徑過來,最好把斜槓改成反斜槓,不改也行,然後保存,或者clean一下就可以了。

 

4、報錯:Program "/ndk-build.cmd" is not found in PATH

\

 

這種報錯,看提示是在Eclipse的變量Path中找不到ndk-build.cmd命令

打開Eclipse的變量Path看看

\

點擊右邊的Variables按鈕查看該項目對應的變量裡面有沒有NDKROOT

\

果然是沒有的,

\

添加一下就好了,設置成ndk在本機的路徑即可,

項目名稱上右鍵,選擇Properties,添加環境變量NDKROOT

\\\

 

5、報錯Unresolved inclusion:

\

 

這個主要是由於opencv的庫文件沒有配置對引起的

重新配置一次就好了

查看一下原始配置

\

 

很明顯,這個路徑不是我本機上opencv的路徑,點擊右邊的edit按鈕修改成本機上正確的opencv的路徑即可。

添加以後,apply一下,或者重新clean一下基本就解決了。這個還可以解決__android_log_print無法識別等等問題

6、報錯Type 'size_t' could not be resolved

size_t無法識別,如果其他#include 這些是正常的,提示Type 'size_t' could not be resolved,檢查一下添加的頭文件,是否有下面這個include存在,沒有的話添加一下即可

\

 

本人的路徑如下:

D:\android-ndk-r10\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.8\include

因為我設置的變量NDKROOT為D:\android-ndk-r10,所以我添加以後的效果如上圖所示。

7、報錯Invalid arguments'Candidates are:void * memset(void *, int, unsigned long int)

報錯代碼

\\\

報錯的原因是這個函數第三個參數的類型是size_t類型的,也就unsigned long int類型的,強制轉型即可
 

8、報錯Symbol '__FLT_MAX__' couldnot be resolved

 

FLT_MAX無法識別

代碼如下

\

 

添加頭文件即可

#include

但是在Eclipse裡添加了,貌似也沒用,還沒有解決,等待大神指導,可能是依賴混亂。

但是其實這應該就是宏定義的一個常量而已,搜了一下值應該是這個,自己在代碼裡宏定義一下,先調通代碼要緊。

/* min positive value */
#define FLT_MIN 1.175494351e-38F

/* max value */
#define FLT_MAX 3.402823466e+38F

/* smallest such that 1.0+FLT_EPSILON!= 1.0 */
#define FLT_EPSILON 1.192092896e-07F

就是定義了FLOAT所能表示的最大值,最小值,以及最小的正數

 

9、報錯Unspecified error (The function is notimplemented

\

 

這個報錯的原因是java層調用c層的接口參數沒匹配對,這有兩種情況,

第一種是參數不匹配;第二種是參數匹配了,但是在C層代碼裡沒有聲明那個函數可以被外部調用。

比如我是調用函數Process,

\

 

 

Java層參數和C層的參數也是對應的

Java層:

\

 

C層:JNIEnv*是上下文環境參數,jobject是上下傳遞的對象數據,後面的四個參數要嚴格與java層對應

\

在C層實現這個函數之前,要通過extern "C"再聲明一下這個函數,然後再去實現

\

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved