3

我为 android 项目使用了 c++ 代码,所以我使用了 NDK 工具。IDE是eclipse。编译项目时,出现memcpy函数错误:

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

它也发生mallocstrftime

我是在Windows系统下开发的。

为什么?

这是我的代码的一部分:

#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;
}
...
4

3 回答 3

10

我已经使用以下方法解决了这个问题:

  1. 转到设置:属性-> C/C++ 常规-> 路径和符号
  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 根目录的环境在哪里

我希望它可以帮助其他人遇到同样的问题。感谢您的所有帮助。

于 2013-10-25T02:56:43.523 回答
2

我在代码中没有看到和问题。所以我认为这是我们在使用 Eclipse 进行 NDK 开发时通常面临的索引问题。

有关类似问题,请参见以下链接: https ://code.google.com/p/android/issues/detail?id=33788

可以使用此处指定的过程解决索引问题:

将 C 程序迁移到 Android NDK

总结: 使用 Android GCC 工具链,但更改了实际工具并修改了发现选项,以使包含路径和符号正确。

于 2013-10-23T06:46:28.007 回答
0

默认情况下,C++ 编译器比 C 编译器严格。尝试以 C 风格或 C++ 风格在您的代码中添加类型转换 -

memcpy((void *)rtn, (const void *)ba, (int)alen);
于 2013-10-23T08:56:27.330 回答