1

我也在尝试构建一个使用 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
    
  • cp文件:

    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链接的模板

我的代码有什么问题?

4

1 回答 1

1

当使用“extern C”块时,您只能使用 C 可用的东西,这样就排除了函数重载/多态性、命名空间等。

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

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

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

于 2013-10-03T11:47:47.910 回答