android ndk开发问题:memcpy函数的'无效的参数'错误 [英] android ndk development issue: 'Invalid arguments' error for memcpy function

查看:1313
本文介绍了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;
}
...


解决方案

我已使用以下方法修复此问题:


  1. 转到设置:properties - > C / C ++ General - >路径和符号

  2. 选择包含标签并选择GNU C ++

  3. 添加新的包含目录:
    $ { 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:

  1. go to setting: properties -> C/C++ General -> Paths and Symbols
  2. choose the "Includes" tab and select "GNU C++"
  3. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆