編輯:關於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
本人的路徑如下:
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
9、報錯Unspecified error (The function is notimplemented
這個報錯的原因是java層調用c層的接口參數沒匹配對,這有兩種情況,
第一種是參數不匹配;第二種是參數匹配了,但是在C層代碼裡沒有聲明那個函數可以被外部調用。
比如我是調用函數Process,
Java層參數和C層的參數也是對應的
Java層:
C層:JNIEnv*是上下文環境參數,jobject是上下傳遞的對象數據,後面的四個參數要嚴格與java層對應
在C層實現這個函數之前,要通過extern "C"再聲明一下這個函數,然後再去實現
先熟悉幾個Android屏幕的計量單位屏幕尺寸:指的是手機實際的物理尺寸也就是屏幕的對角線的長度,比如常用的4.0英寸,4.7英寸,5.0英寸,5.5英寸。單位 英寸in
導讀這篇文章中我不會使用概念性文字來說明裝飾者模式,因為通常概念性的問題都很抽象,很難懂,使得讀者很難明白到底為什麼要使用這種設計模式,我們設計模式的誕生,肯定是前輩們在
Android的animation由四種類型組成Android動畫模式Animation主要有兩種動畫模式:一種是tweened animation(漸變動畫) XM
接下來的幾篇博客將通過小Demo來測試下事件分發機制,進而能更好的理解源碼,至於源碼的分析,網上有很多帖子了,大家可以自行查看啦!注意本篇博客是默認在你理解了ViewGr