2013-10-02 63 views
1

我正在嘗試構建一個使用opencv for android的示例。這裏是我的C++代碼:Opencv4Android:如何使用C++

  • 頭文件

    #ifdef __cplusplus 
    extern "C" { 
    #endif 
    #include "jni.h" 
    #include "opencv2/core/core.hpp" 
    namespace openCVFuncs 
    { 
        cv::Mat contrastFilter(cv::Mat inputMatm, float contrastValue); 
    } 
    #ifdef __cplusplus 
    } 
    #endif 
    
  • cpp文件:

    namespace openCVFuncs 
    { 
        cv::Mat contrastFilter(cv::Mat inputMat, float contrastValue) 
        { 
         contrastValue = pow(2,contrastValue); 
         cv::Mat outMat = inputMat.clone(); 
         uchar* data_img_in=(uchar*)inputMat.data; 
         uchar* data_img_out=(uchar*)outMat.data; 
         int temp = 0; 
         for(int i=0;i<inputMat.size().height;i++) 
          for(int j=0;j<inputMat.size().width;j++) 
           for (int c=0;c<inputMat.channels();c++) 
           { 
            temp = (data_img_in+inputMat.step[0]*i)[j*inputMat.channels()+c];      
            temp = (int)((temp - 128.0) * contrastValue) +128; 
            if (temp < 5) temp = 5; 
            if (temp > 255) temp = 255;      
            (data_img_out+outMat.step[0]*i)[j*outMat.channels()+c] = temp; 
           } 
         return outMat; 
        }; 
    } 
    

而且我得到了很多這樣的錯誤是:

/opt/android-ndk-r9/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/valarray_before.h:652:3: error: template with C linkage

我的代碼有什麼問題?

回答

1

當使用「extern C」塊時,只能使用C可用的東西,這樣就可以排除函數重載/多態,函數名稱空間等等。

在發佈的頭文件中,包含一個.hpp文件(可能包含其中一個不可用的定義)並定義一個名稱空間。

這個頁面給出了一些關於這個主題的一些很好的指針,你可以做什麼以及不可以做什麼,以及如何將調用包裝爲C++命名空間/重載函數,以用於由C編譯器編譯的庫中,請參閱「從內部訪問C++代碼C源「:

http://www.oracle.com/technetwork/articles/servers-storage-dev/mixingcandcpluspluscode-305840.html