2013-10-23 59 views
3

我對android項目使用了C++代碼,所以我使用了NDK工具。 IDE是eclipse。 當編譯項目,我得到了錯誤的memcpy功能:android ndk開發問題: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; 
} 
... 
+0

您是否包含正確的頭文件? –

+0

你可以發佈一些你的代碼,以便我們知道代碼中出了什麼問題。同時發佈您已包含的標題。 – Zax

+0

@退休忍者,是的,我已經包括'string.h','stdlib.h','stdio.h' – tidy

回答

10

我使用下面的方法解決此問題:

  1. 去設置:屬性 - > C/C++常規 - >路徑和符號
  2. 選擇「包含」選項卡,選擇「GNU C++」
  3. 添加新的include目錄: ${NDKROOT}\toolchains\arm-linux-androideabi-4.8\prebuilt\windows-x86_64\lib\gcc\arm-linux-androideabi\4.8\include,其中${NDKROOT}是我的Android NDK根目錄
  4. 01環境

我希望它能幫助別人遇到同樣的問題。感謝你們所有的幫助。

0

默認情況下,C++編譯器比C編譯器嚴格。嘗試要麼採用C風格的或C++風格添加型鑄造在你的代碼 -

memcpy((void *)rtn, (const void *)ba, (int)alen);