2013-10-02 26 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