使用NDK应用程序中的CURL和Table Fusion
我正试图使用NDK应用程序中的CURL库访问google 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
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