Android的NDK开发的问题:“无效的参数”错误memcpy函数 [英] android ndk development issue: 'Invalid arguments' error for memcpy function
本文介绍了Android的NDK开发的问题:“无效的参数”错误memcpy函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我用C ++ code的Android项目,所以我用的是NDK工具。
该IDE是日食。
当编译项目,我得到的误差的memcpy
功能:
参数无效
考生:
无效*的memcpy(void *时,常量无效*,?)
它发生在的malloc
,的strftime
了。
我在Windows系统下开发的。
为什么?
下面是我的code部分:
的#include<载体>
#包括<的iostream>
#包括< fstream的>
#包括<迭代器>
#包括dirent.h
#包括< jni.h>
#包括< stdio.h中>
#包括< stdlib.h中>
#包括< string.h中>
#包括<安卓/ log.h>
串getCurrentDate(){
time_t的rawtime;
结构TM * timeinfo;
字符缓冲区[80];
时间(安培; rawtime);
timeinfo =本地时间(安培; rawtime);
// #######################误差部分
的strftime(缓冲区,80,%Y-%M-%D_%H-%M-%S,timeinfo);
串timeStr(缓冲液);
返回timeStr;
}
标准::字符串jstring2str(JNIEnv的* ENV,的jstring jstr){
字符* RTN = NULL;
JCLASS clsstring = ENV->的findClass(爪哇/郎/字符串);
的jstring STREN code = ENV-> NewStringUTF(GB2312);
jmethodID中期= ENV->的GetMethodID(clsstring,GetBytes会,
(Ljava /朗/字符串;)[B);
jbyteArray巴尔=(jbyteArray)ENV-> CallObjectMethod(jstr,中,STREN code);
jsize阿伦= ENV-> GetArrayLength(巴尔);
jbyte * BA = ENV-> GetByteArrayElements(巴尔,JNI_FALSE);
如果(阿伦大于0){
// ####################错误的malloc
RTN =(字符*)malloc的(阿伦+ 1);
// ####################错误的memcpy
的memcpy(RTN,BA,阿伦);
RTN [阿伦] = 0;
}
ENV-> ReleaseByteArrayElements(巴尔,BA,0);
标准::字符串STEMP(RTN);
免费(RTN);
返回STEMP;
}
...
解决方案
我用下面的方法解决此问题:
- 进入设置:属性 - > C / C ++通用 - >路径和符号
- 选择了包括选项卡,选择GNU C ++
- 添加新的包含目录:
<$c$c>${NDKROOT}\toolchains\arm-linux-androideabi-4.8\$p$pbuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include$c$c>,其中,
$ {NDKROOT}
是环境,我的Android NDK根目录
我希望这可以帮助别人遇到了同样的问题。感谢您的帮助都是一样的。
I used a c++ code for android project, so I use the NDK tools.
The IDE is eclipse.
When compile the project, I got the error for memcpy
function:
Invalid arguments '
Candidates are:
void * memcpy(void *, const void *, ?)
'
It happens for malloc
, strftime
too.
I developed under Windows system.
Why?
Here is part of my code:
#include <vector>
#include <iostream>
#include <fstream>
#include <iterator>
#include "dirent.h"
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <android/log.h>
string getCurrentDate() {
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time(&rawtime);
timeinfo = localtime(&rawtime);
// #######################error part
strftime(buffer, 80, "%Y-%m-%d_%H-%M-%S", timeinfo);
string timeStr(buffer);
return timeStr;
}
std::string jstring2str(JNIEnv* env, jstring jstr) {
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("GB2312");
jmethodID mid = env->GetMethodID(clsstring, "getBytes",
"(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0) {
// ####################error for malloc
rtn = (char*) malloc(alen + 1);
// ####################error for memcpy
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
std::string stemp(rtn);
free(rtn);
return stemp;
}
...
解决方案
I have fix this issue using the following method:
- go to setting: properties -> C/C++ General -> Paths and Symbols
- choose the "Includes" tab and select "GNU C++"
- add new include directories:
${NDKROOT}\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include
, where${NDKROOT}
is environment for my android-ndk root directory
I hope it can help others encounter the same issue. Thanks for all your helps all the same.
这篇关于Android的NDK开发的问题:“无效的参数”错误memcpy函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文