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

查看:842
本文介绍了Android的NDK开发的问题:“无效的参数”错误memcpy函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用C ++ code的Andr​​oid项目,所以我用的是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;
}
...
 

解决方案

我用下面的方法解决此问题:

  1. 进入设置:属性 - > C / C ++通用 - >路径和符号
  2. 选择了包括选项卡,选择GNU C ++
  3. 添加新的包含目录: <$c$c>${NDKROOT}\toolchains\arm-linux-androideabi-4.8\$p$pbuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include,其中, $ {NDKROOT} 是环境,我的Andr​​oid 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天全站免登陆