使用NDK应用程序中的CURL和Table Fusion

使用NDK应用程序中的CURL和Table Fusion,curl,android-ndk,google-fusion-tables,Curl,Android Ndk,Google Fusion Tables,我正试图使用NDK应用程序中的CURL库访问google fusion服务这是我的代码: jstring Java_com_AnalyticToolC_AnalyticToolActivity_JNISendData( JNIEnv* env,jobject entryObject,jstring webpageJStr,jstring loginHeaderJStr,jstring insertJStr) { pageInfo_t page; CURL *curl; C

我正试图使用NDK应用程序中的CURL库访问google fusion服务这是我的代码:

jstring Java_com_AnalyticToolC_AnalyticToolActivity_JNISendData( JNIEnv* env,jobject entryObject,jstring webpageJStr,jstring loginHeaderJStr,jstring insertJStr)
{
    pageInfo_t page;
    CURL *curl;
    CURLcode res;
    char *buffer;

    const jbyte *webpage;
    webpage = (*env)->GetStringUTFChars(env, webpageJStr, NULL);

    if (webpage == NULL) {
        return NULL; /* OutOfMemoryError already thrown */
    }

    page.data = (char *)malloc(16 * 1024);
    page.len = 0;
    if (page.data)
    memset(page.data, 32, 16 * 1024);

    buffer = (char *)malloc(1024);

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, webpage);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HTTPData);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page);

        curl_easy_setopt(curl, CURLOPT_POST, 1);
        const jbyte *insert;
        insert = (*env)->GetStringUTFChars(env, insertJStr, NULL);
        //post field to request
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, insert);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sizeof(insert));

        struct curl_slist *headers = NULL;
        const jbyte *auth;
        auth = (*env)->GetStringUTFChars(env, loginHJStr, NULL);
        headers = curl_slist_append(headers, auth);
        // attach headers to this request
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        res = curl_easy_perform(curl);
        /* always cleanup */
        curl_easy_cleanup(curl);
        (*env)->ReleaseStringUTFChars(env, webpageJStr, webpage);
        if(res == 0) {
            if (buffer) {
                page.data[page.len < 256 ? page.len : 256] = '\0';
                sprintf(buffer, "pagedata(%d): %s. done.\n", page.len, page.data);
                return (*env)->NewStringUTF(env, buffer);
            }
        }
        sprintf(buffer, "Result %d", res);
        return (*env)->NewStringUTF(env, buffer);
    }
    else
    {
        return (*env)->NewStringUTF(env, "Unable to init cURL");
    }
} 

typedef struct pageInfo_t {
    char *data;
    int  len;
};

static size_t HTTPData(void *buffer, size_t size, size_t nmemb, void *userData) {
    int len = size * nmemb;
    pageInfo_t *page = (pageInfo_t *)userData;
    if (buffer && page->data && (page->len + len < (16 * 1024)) ) {
        memcpy(&page->data[page->len], buffer, len);
        page->len += len;
    }
    return len;
}
jstring Java\u com\u analytictool c\u analytictool activity\u JNISendData(JNIEnv*env、jobject entryObject、jstring webpageJStr、jstring loginHeaderJStr、jstring insertJStr)
{
页面信息页面;
卷曲*卷曲;
卷曲编码;
字符*缓冲区;
const jbyte*网页;
webpage=(*env)->GetStringUTFChars(env,webpageJStr,NULL);
如果(网页==NULL){
返回NULL;/*OutOfMemoryError已抛出*/
}
page.data=(char*)malloc(16*1024);
page.len=0;
如果(第页数据)
memset(page.data,32,16*1024);
缓冲区=(字符*)malloc(1024);
curl=curl_easy_init();
if(curl){
curl_easy_setopt(curl,CURLOPT_URL,网页);
curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,HTTPData);
curl_easy_setopt(curl、CURLOPT_WRITEDATA和page);
curl_easy_setopt(curl,CURLOPT_POST,1);
常量jbyte*插入;
insert=(*env)->GetStringUTFChars(env,insertJStr,NULL);
//要请求的post字段
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,insert);
curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,sizeof(insert));
struct curl_slist*headers=NULL;
常量jbyte*auth;
auth=(*env)->GetStringUTFChars(env,loginHJStr,NULL);
headers=curl\u slist\u append(headers,auth);
//将标题附加到此请求
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
res=旋度(curl)\u容易执行(curl);
/*总是清理*/
旋度\轻松\清洁(旋度);
(*env)->发布StringUTFChars(env,网页JSTR,网页);
如果(res==0){
if(缓冲区){
page.data[page.len<256?page.len:256]='\0';
sprintf(缓冲区,“页面数据(%d):%s.完成。\n”,page.len,page.data);
return(*env)->NewStringUTF(env,buffer);
}
}
sprintf(缓冲区,“结果%d”,res);
return(*env)->NewStringUTF(env,buffer);
}
其他的
{
return(*env)->NewStringUTF(env,“无法初始化cURL”);
}
} 
typedef结构页面信息{
字符*数据;
内伦;
};
静态大小HTTPData(void*缓冲区、大小、大小nmemb、void*用户数据){
int len=大小*nmemb;
pageInfo\u t*页面=(pageInfo\u t*)用户数据;
如果(缓冲区和页面->数据和(页面->长度+长度<(16*1024))){
memcpy(&page->data[page->len],缓冲区,len);
页面->len+=len;
}
回程透镜;
}
这些是android应用程序传递给方法的字符串值

1-webpageJStr=”http://www.google.com/fusiontables/api/query“

2-loginHeaderJStr=“Authorization:GoogleLogin Auth=dddnjb…”
//我拥有我的用户的令牌值
3-insertJStr=“sql=插入2887732(应用程序名称、设备型号、执行日期)值('test'、'test'、'02/02/2011')”

问题是我总是得到响应字符串

“Sql参数不能为空错误400”

有人能帮我吗,我的请求头或内容有什么问题,或者我的CURL选项有问题,我从这两天就被卡住了

有几件事可以尝试:

  • 删除POSTFIELDSIZE curl选项。这是最好的搭配
  • 您的查询是否正在进行URL编码?尝试对查询进行url编码
  • 尝试在FT URL中使用https而不是http

非常感谢kathryn,关于POSTFIELDSIZE curl选项的问题,我只评论了一行就行了