使用CURL通过NDK写入文件会抛出致命信号11

时间:2015-12-16 11:01:48

标签: android c++ curl android-ndk

以下代码片段是我使用Android NDK编译的代码片段。从Java我传递一个文件夹来写一个文件。我试图从Java和C ++(虽然一次)执行mkdir并获得相同的结果。在下面的代码片段中,我正在用C ++创建文件夹。

int statusMKDIR = mkdir(folderToWrite, 0755);
LOGD(string("status mkdir: " + to_string(statusMKDIR)).c_str()); // this is always -1
CURL *curl;
FILE *fp;
CURLcode res;
string outfilename = string(folderToWrite+string("/file.zip"));
curl = curl_easy_init();

if (curl) {
    fp = fopen(outfilename.c_str(),"wb");

    // header
    struct curl_slist *chunk = NULL;
    chunk = curl_slist_append(chunk, "append");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
    // end header

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
    if (fp)
        LOGD("fp exists");
    else {
        LOGD("we're gonna craaaaaaaaaash"); // here is what it prints when it throws the Fatal Signal 11
    }

    res = curl_easy_perform(curl);

    std::ostringstream out;
    out << res;
    string content = out.str();

    curl_easy_cleanup(curl);
    fclose(fp);
}

所以,这只发生在 SOMETIMES 。我认为文件夹没有发布。我认为这可能有用:

    if (fp)
        LOGD("fp exists");
    else {
        while (!fp) {
            fp = fopen(outfilename.c_str(),"wb");
        }
    }

size_t write_data(void * ptr,size_t size,size_t nmemb,FILE * stream){     LOGD( “书面方式”);     size_t write = 0;     if(size&gt; 0&amp;&amp; nmemb&gt; 0){         written = fwrite(ptr,size,nmemb,stream);     }     LOGD(“结束写作”); //当它有时崩溃时,它没有达到这一点。     归还; }

但这会以无限循环结束。

我该怎么调试呢?因为有时我可以写,有些我不能写。我无法重现为什么有时它不起作用。

我的堆栈跟踪是:

  

A / libc:致命信号11(SIGSEGV),代码1,故障地址0x30 in tid 29956(AsyncTask#2)

非常感谢。

0 个答案:

没有答案