2 ssdpowerful SSDpowerful 于 2014.02.28 16:59 提问

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);
这句话穿入的参数是正确的,返回的却为空。
还请各位大神不吝赐教!!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【JNI】C中调用JAVA的参数、方法
 【JNI】C中调用JAVA的参数、方法 1、c中返回一个字符串        ...................      (*env)->NewStringUTF(env,"Huazi 华仔");       ................... 2、 c中返回一个数组     .....................     int i
Android-使用C++实现调用本地方法返回字符串显示在界面上/NDK-JNI开发实例(八)
本地方法使用C与C++的实现代码是不同的,且.h头文件必须引用; 在生成jni文件夹同时将生成.h头文件放在该目录下、命令: 进入项目名-->app-->src-->main-->java 目录下输入  javah -d ../jni -jni 包名.类名  (将.h生成头文件放在上级目录中创建jni文件夹中)   Android33\app\src\main\java>javah -d
JNI字符串参数传递与返回值
在编程的时候我们不仅需要使用无参的函数,有参数的函数也是必须的。 这次我编写一个函数用来传递String类型参数,并输出该函数的返回值。 编写java类: [java] view plaincopy class StringFunction   {       private native String getWords(Stri
android(NDK+JNI)---JNI字符串参数传递与返回值
转载请注明出处! 原文地址链接:http://blog.csdn.net/zgyulongfei/article/details/7409441   在编程的时候我们不仅需要使用无参的函数,有参数的函数也是必须的。 这次我编写一个函数用来传递String类型参数,并输出该函数的返回值。 编写java类:   class StringFunction
php解析http获取的json字符串变量总是空白null
这篇文章主要介绍了php解析http获取的json字符串变量总是空白null的解决方法,个人经验的总结,这里推荐给大家。 今天同事项目中遇到一个问题,通过http接口获取的json字符串使用json_decode始终无法正确解析,返回空白。 直接把结果字符串复制出来手动创建一个变量却正常,在前端js也能解析,搞了半天不得其解,借助强大的谷歌解决了问题,答案是接口吐出的结果包含有BO
jni C语言调用java的小例子(java返回string)
jclass regionClass = env->FindClass("com/oppo/util/RfUtils"); //查找java类RfUtils if(regionClass!=0){ jmethodID mid; mid = env->GetStaticMethodID(regionClass, "getPrjVersion", "()
在后台处理请求返回的json字符串
JSON 语法规则 在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:对象表示为键值对,数据由逗号分隔,花括号保存对象,方括号保存数组。 在项目中遇到请求其他程序的接口时,往往无法直接处理返回的json字符串。例如: String result = HttpU
jni技术java调用c代码返回字符串
首先在项目建一个jni文件夹,把C代码放在jni目录下,编译时需要android.mk文件,用于声明编译后的文件名和编译那个c文件等信息. JAVA 代码 public class DemoActivity extends Activity { static{ //把 的c代码的库文件加载到java虚拟机里面 // 不要写so的前缀lib 也不要写扩展名.so System.l
JNI c调用Java 返回值为String
Java定义: public String getSignatureInfo() { try { PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), PackageManager.GET_SIGNATUR
JNI中的string返回jstring
项目中有个需求,需要jni中返回jstring,由于一直在c++中使用string拼接字符串,所以返回得把string转成jstring,网上搜了下,非常麻烦,再加上我返回jstring用的统一接口是 env->NewStringUTF(result) env为jni指针,result为const char* 所以想到先把string转成const char*,然后直接调用这个接口返回str