Opencv4Android:如何与C ++一起使用

时间:2013-10-02 17:13:48

标签: android c++ opencv android-ndk

我正在尝试使用opencv for android构建一个示例。这是我的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:错误:带C链接的模板

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:1)

当使用“extern C”-block时,你只能使用C可用的东西,以便排除函数重载/多态,命名空间等等。

在您发布的头文件中包含.hpp文件(可能包含其中一个不可用的定义)并定义命名空间。

这个页面提供了关于这个主题的一些很好的指示,你可以做什么和不能做什么,以及如何包装对C ++命名空间/重载函数的调用,以便在C编译器编译的库中使用,请参阅“从C语言中访问C ++代码”源“:

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