Error处置:Invalid arguments ' Candidates are: void * memcpy(void * const void * ?)

Error处理:Invalid arguments ' Candidates are: void * memcpy(void *, const void *, ?)

Error处理:Invalid arguments ' Candidates are: void * memcpy(void *, const void *, ?)



JNI开发的过程中遇到的问题。

现象如下:

Invalid arguments ' Candidates are: void * memcpy(void *, const void *, ?)
Invalid arguments 'Candidates are: void * malloc(?)

在包含的头文件中也看到函数的原型,如下:

extern __mallocfunc void*  malloc(size_t);
extern void*  memcpy(void *, const void *, size_t);

错误提示中:Invalid arguments,意味着参数无效,很明显是size_t这个参数不被正常识别造成的。


源于此分析,那么凡是使用size_t类型参数的方法均会出现这个问题,例如:resize memset,memccpy,memchr,memcmp等。


鉴于此,要解决这个问题,思路有二,第一:使用其他方法进行替代,不使用memcpy,malloc,memset方法。第二:让系统能够正常识别size_t类型,此为根本解决此问题之道。下面就两种思路各提供详细解决方案。


第一:替代法


可以使用new、strcpy来替代malloc、memcpy;这里针对malloc,memcpy两个方法,其他方法可以自己找相应的方法来替代。

例如:

原来为:

 const char* tmp = env->GetStringUTFChars(jstr_mac,NULL);
 
size_t len= strlen(tmp)+ 1;

 char*mac = (char*) malloc(len);
 
memcpy(mac, tmp, len);

 

可以改为:

 const char* tmp = env->GetStringUTFChars(jstr_mac,NULL);
 
int len= strlen(tmp)+ 1;
 
char*mac = new char[len];
 
strcpy(mac, tmp);


第二:让系统能够识别size_t类型

方案如下:

  1. 右击项目工程properties -> C/C++ General -> Paths and Symbols。

  2. 选择 "Includes" 标签

F:\android-ndk-r9b\platforms\android-19\arch-arm\usr\include

F:\android-ndk-r9b\toolchains\arm-linux-androideabi-4.8\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.8\include

主要是这一句,因为Opencv教程配置里原来没有加这么一句。

如此,该问题可解。


备注说明:

还可在将以下两个头文件库添加到项目的include中:

F:\android-ndk-r9b\sources\cxx-stl\gnu-libstdc++\4.8\include

F:\android-ndk-r9b\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi-v7a\include


你可能感兴趣的:(Error处置:Invalid arguments ' Candidates are: void * memcpy(void * const void * ?))