我正在尝试使用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链接的模板
我的代码出了什么问题?
答案 0 :(得分:1)
当使用“extern C”-block时,你只能使用C可用的东西,以便排除函数重载/多态,命名空间等等。
在您发布的头文件中包含.hpp文件(可能包含其中一个不可用的定义)并定义命名空间。
这个页面提供了关于这个主题的一些很好的指示,你可以做什么和不能做什么,以及如何包装对C ++命名空间/重载函数的调用,以便在C编译器编译的库中使用,请参阅“从C语言中访问C ++代码”源“:
http://www.oracle.com/technetwork/articles/servers-storage-dev/mixingcandcpluspluscode-305840.html