android ndk开发问题:memcpy函数的'无效的参数'错误 [英] android ndk development issue: 'Invalid arguments' error for memcpy function
本文介绍了android ndk开发问题:memcpy函数的'无效的参数'错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我为android项目使用了一个c ++代码,所以我使用NDK工具。
IDE是eclipse。
编译项目时,出现 memcpy
函数的错误:
无效的参数'
候选项是:
void * memcpy(void *,const void *,?)
'
它也会出现在 malloc
, strftime
/ p>
我在Windows系统下开发。
为什么?
这是我的代码的一部分:
#include< vector&
#include< iostream>
#include< fstream>
#include #includedirent.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);
// ##############################错误部分
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){
// ###################错误为malloc
rtn =(char * )malloc(alen + 1);
// #################### memcpy的错误
memcpy(rtn,ba,alen);
rtn [alen] = 0;
}
env-> ReleaseByteArrayElements(barr,ba,0);
std :: string stemp(rtn);
free(rtn);
return stemp;
}
...
解决方案
我已使用以下方法修复此问题:
- 转到设置:properties - > C / C ++ General - >路径和符号
- 选择包含标签并选择GNU C ++
- 添加新的包含目录:
$ { NDKROOT} \toolchains\arm-linux-androideabi-4.8 \prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\ include
,其中$ {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屋!
查看全文