至於opencv的環境配置這裡就不再囉嗦了,網上有很多這樣的文章,也很好,請參考那些優秀的部落格。
第一個問題:<vector>這個檔案無法找到。我先試了試http://stackoverflow.com/questions/4893403/cant-include-c-headers-like-vector-in-android-ndk這上面說的方法,具體就是在application..mk中添加APP_STL := gnustl_static ,但這種方法不奏效啊,依然報“ fatal error: vector: No
such file or directory”。我查了查android官方的例子有沒有使用<vector>的例子,查了查還真有,我的路徑是“D:\android\android-ndk-r8e\tests\device\test-gnustl-copy_vector_into_a_set”裡面有一個使用<vector>的例子,我試著使用自己的cygwin編譯,並且通過了,這說明我的cygwin沒有問題。
我把這個例子的android.mk和application.mk抄寫到我的工程裡,還是出現 fatal error: vector: No such file or directory”,最後的差別就是副檔名android的官方例子是cpp,我的副檔名是c,我改過來了,然後編譯成功了。
第二個問題:把c改成cpp後另一個問題出現了,”operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}' “又報了這個錯,原來cpp檔案android的ndk它就預設這是個c++檔案,使用c++介面,如果是c,ndk預設在編譯時間使用c介面因此造成這種問題。改正後的是:
這個問題的參考網址:http://bbs.csdn.net/topics/390355890
問題3:使用多個cpp檔案編譯。把一個大的功能分散到多個函數中,並且把每個函數寫在一個cpp檔案中,這符合c語言的模組化思想,也便於程式員看代碼。可能語言表達不清楚,直接:這個jni檔案夾中有兩個cpp檔案,一個是jni_part.cpp,一個是test.cpp.
如果在vs2010中編輯的話不需要做任何的改動,直接在test.hpp中聲明以下,然後再在jni_part.cpp中包含這個test.hpp檔案即可,但是無論在ndk,還是在gcc中,這種簡單的做法是行不通的,在gcc中需要更改make檔案,在ndk中則需要改動Android.mk檔案。畫三角的是只有jni_part.cpp時的mk檔案,當加入test.cpp後需要添加對號所在的那行文字。並且這一行的位置也有要求,必須在include$()和最後的一個include$()之間。