c++-C++ 调用Jni 返回json字符串时产生的问题,穿入参数后返回的字符串是空的

问题描述

C++ 调用Jni 返回json字符串时产生的问题,穿入参数后返回的字符串是空的

java代码如下:
package com.iscas.test;
import java.util.ArrayList;
import com.google.gson.Gson;
import net.sf.json.JSONSerializer;
public class Test {
public String getItemList(int id,String name,float score)
{
ItemList list = new ItemList();
Item item = new Item();
item.id = id;
item.name = name;
item.score = score;

list.itemList = new ArrayList();
list.itemList.add(item);
list.itemList.add(item);
list.itemList.add(item);

list.num = 3;

Gson gson = new Gson();
String json = gson.toJson(list).toString();

return json;
}
}
穿入参数,返回json字符串,相应的C++ 调用jni代码如下:
#include
#include
#include
#include "windows.h"
using namespace std;
#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
jstring NewJString(JNIEnv env, LPCTSTR str);
string JStringToCString (JNIEnv *env, jstring str);
int main()
{
JavaVMOption options[3];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass test,item,itemList;
jmethodID mid;
options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = "-verbose:jni"; //用于跟踪运行时的信息
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void
*)&env, &vm_args);

if (status != JNI_ERR)
{
    test = env->FindClass("com/iscas/test/Test");
    item = env->FindClass("com/iscas/test/Item");
    itemList = env->FindClass("com/iscas/test/ItemList");

    if(test !=0 && item!=0)
    {
        mid = env->GetMethodID(test, "getItemList", "(ILjava/lang/String;F)Ljava/lang/String;");

        if(mid != 0)
        {  

            jobject obj_test = env->AllocObject(test);
            jobject obj_item = env->AllocObject(item);

            mid = env->GetMethodID(test,"getItemList","(ILjava/lang/String;F)Ljava/lang/String;");

            jint instance_id = 10;
            const char arg[] = "jom";
            jstring instance_name = NewJString(env, arg);
            jfloat instance_score = 98.5;

            jstring s = (jstring)env->CallObjectMethod(obj_test,mid,instance_id,instance_name,instance_score);
            cout<<s<<endl;
            string ss = JStringToCString(env,s);
            cout<<ss<<endl;

        }

    }

}
}
PS1:在工程目录下 com/iscas/test/ 路径下放置着 Test.class,Item.class,ItemList.class以及 gson-2.2.4.jar,jdom-2.0.5.jar,json-lib-2.4-jdk15.jar。
PS2:通过设置断点来看,
jstring s = (jstring)env->CallObjectMethod(obj_test,mid,instance_id,instance_name,instance_score);
这句话穿入的参数是正确的,返回的却为空。
还请各位大神不吝赐教!!

时间: 2025-01-02 14:22:00

c++-C++ 调用Jni 返回json字符串时产生的问题,穿入参数后返回的字符串是空的的相关文章

对象- window.showModalDialog传递参数后返回值

问题描述 window.showModalDialog传递参数后返回值 window.showModalDialog传递参数var obj = new Object()后 返回值是什么 解决方案 什么类型的数据都可以

Java Web程序实现返回JSON字符串的方法总结_java

基础铺垫在java中,关于json的lib有很多,比如jackjson.fastjson.gson等等,本人都用过,但是对于我等只需要让java对象返回json字符串即可的程序员来说,还是显得过于繁重.而且有些功能定制性很差,比如一个java对象的属性为空时,这些组件都不会输出,于是本人在页面循环遍历列表对象时,总是得判断此属性是否为undefined,这一点让本人很不满意.所以决定花点时间研究下到底是怎么回事. 但经过一上午的细看,发现不管是fastjson还是gson都代码都写得相当的复杂,

spring mvc-4.1springmvc返回json问题

问题描述 4.1springmvc返回json问题 用的hibernate+springmvc+spring 都是4.0+的,用了jackson-annotation,jack-core,jackson-databind,都是2.6.0版本,开启了mvc:annotation-driven,然而返回json总是报406:The resource identified by this request is only capable of generating responses with char

排除JQuery通过HttpGet调用WebService返回Json时“parserror”错误_实用技巧

JQuery大家都经常用,以前用的时候没有注意什么.最近本人在使用JQuery通过HttpGet方式调用WebService时,却发现服务端并非如人所愿返回json数据,而是返回错误提示:parserror. 如今问题被顺利解决,下面是解决过程 首先看客户端使用JQuery调用WebService的代码: 复制代码 代码如下: getHellobyAjax: function(callabckFun) { $.ajax({ type: "GET", url: "WebServ

JQuery通过HttpGet调用WebService返回Json时“parserror”错误

首先看客户端使用JQuery调用WebService的代码:    代码如下 复制代码           getHellobyAjax: function(callabckFun) {             $.ajax({                 type: "GET",                 url: "WebService.asmx/HelloWorld",                 //contentType: "app

asp.net 的前台用$.ajax调用ashx返回json数据问题

问题描述 asp.net的前台用$.ajax调用ashx返回,如果把ajax的dataType改为'"text",alert(msg)显示{"id":"111","c1":"aa","c2":"bb"},dataType改为"json",alert(msg)不显示,alert(msg[0])显示{.用varobj=eval("("

JQuery ajax返回JSON时的处理方式 (三种方式)_AJAX相关

最近在使用JQuery的ajax方法时,要求返回的数据为json数据,在处理的过程中遇到下面的几个问题,那就是采用不同的方式来生成json数据的时候,在$.ajax方法中应该是如何来处理的,下面依次来进行说明,由于本人使用的是asp.net,所以处理的页面都是采用.net来做的!其他的方式应该是相同的吧         一.JSON的一些基础知识. JSON中对象通过"{}"来标识,一个"{}"代表一个对象,如{"AreaId":"12

getJSON调用后台json数据时函数被调用两次的原因猜想_jquery

近期在做前端开发时候使用到getJSON调用后台去json数据,发现后台的函数被调用两次,函数名称为getMessages, 多方调查结合网上兄弟经验发现,只要函数名不以get开头就没这个问题了, 本人大胆猜测,应该是请求返回的时候构造json数据时,调用所有get开头的函数,然后取得返回值然后构造响应. 所以,以get开头的函数做action的函数时,首先响应请求调用了一次,然后构造响应又调用了一次.

jquery调用基于.NET Framework 3.5的WebService返回JSON数据

jquer调用WebService网上的介绍也比较多,最近的项目中我也用到不少,一直都很少用.net ajax,比较钟情于jquery,调用请求WebService有几种方法,这主要说一下POST与GET方法,其实安全方法考虑不建议使用GET方法,下面就说一下用jquery调用WebService的参数设置及设置不当所出现的问题,还有出现问题的原因.我们这里只讨论返回JSON格式数据的情况,相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的童鞋可以从网上找一下这方面的资料来看一下,