0 0

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

java代码如下:返回一个json字符串。

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 <jni.h>
#include <iostream>
#include <string>
#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;


			}

		}

			jvm->DestroyJavaVM();
			return 0;
		}
	else
	{
		return -1;
	}

}


jstring NewJString(JNIEnv *env, LPCTSTR str)  
{  
  ......
}  

string  JStringToCString (JNIEnv *env, jstring str)// (jstring str, LPTSTR desc, int desc_len)  
{  
    ......
}  

 

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

2014年2月28日 17:21
目前还没有答案

相关推荐

    java传送json到jni,jni传送json到java

    当JNI方法执行完毕后,它会返回一个JSON字符串,你可以再次使用Java的JSON库将其反序列化为Java对象。 8. **性能优化**: 跨语言数据传递可能会有性能开销,特别是在频繁交互时。考虑使用数据缓冲区或一次性处理...

    android Json使用

    2. **JSON在JNI中的应用**:为了在Java和C++之间传递JSON数据,通常需要将JSON字符串作为参数传入JNI函数,然后在C++端解析这个字符串。可以使用开源库如`nlohmann/json`在C++中处理JSON。 3. **数据转换**:在Java...

    jniJsonCpp.rar

    这个例子演示了如何在C++中使用jsoncpp解析JSON字符串,并将其结果返回到Java层。实际项目中,你可以根据需求修改这个例子,实现序列化、反序列化、修改JSON数据等操作。通过这种方式,你可以利用C++的性能优势来...

    android studio 下jni学习

    在Java层,可以使用Gson或Jackson等库将接收到的JSON字符串转化为Java对象。 总结来说,Android Studio中的JNI学习涉及项目配置、数据类型转化、本地方法调用以及可能的JSON操作。理解这些基础知识是掌握JNI的关键...

    MFC调用Java的Action

    jsoncpp是一个开源库,用于C++和C语言处理JSON数据,它提供了解析JSON字符串、序列化对象到JSON以及在C++对象和JSON之间转换的功能。 在"TestCurlJson"这个压缩包中,很可能包含了一个示例项目,演示如何在MFC程序...

    JsonCpp_Android:将C++中的JsonCpp移植到Android中,以加快Android中解析Json的效率

    JsonCpp库提供了一套完整的API,包括解析JSON字符串、生成JSON字符串、以及在JSON对象和C++数据结构之间转换的功能。其主要优点在于执行速度快,内存占用少,特别适合处理大规模的JSON数据。移植JsonCpp到Android...

    libjson fro android

    在Java层创建一个JNI接口,声明需要调用的C++函数,比如解析JSON字符串: ```java public class MyJNI { static { System.loadLibrary("myjni"); } public native String parseJsonString(String jsonString);...

    JNObject需要依赖的jar

    1. **JSON解析**:`JSONObject`提供了一系列的方法来解析JSON字符串,例如`new JSONObject(jsonString)`用于从JSON字符串构造一个`JSONObject`实例。 2. **字段访问**:你可以通过键值对的方式获取或设置`...

    lua 源代码 添加了 cJson

    在C语言中,cJson可以高效地处理JSON字符串,将其转化为C结构体,也可以将C结构体编码为JSON字符串。 在这个项目中,cJson被集成到了Lua环境中,这意味着Lua脚本可以直接处理JSON数据。开发者可以通过Lua编写脚本来...

    rapidjson解析下载

    // 解析JSON字符串 std::string jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; rapidjson::Document doc; doc.Parse(jsonString.c_str()); // 访问JSON对象 if (doc.IsObject()) { ...

    java常用jar包

    在Java中,有许多JSON库,如Jackson、Gson、org.json等,它们提供了将Java对象转换为JSON字符串以及反序列化JSON到Java对象的功能。 6. **jstl**: JSTL(JavaServer Pages Standard Tag Library)是一组标准标签...

    android FBReader源码.rar

    3. `res`:包含了应用的资源文件,如布局、图标、字符串等。 二、书籍解析技术 FBReader支持多种格式的电子书,如EPUB、FB2、MOBI等。其解析过程涉及XML解析、ZIP解压等技术。对于EPUB,FBReader会解析OPF和NCX...

    Android-笔试题目.docx

    String 和 StringBuilder 都是字符串操作类,String 是不可变的,而 StringBuilder 是可变的,适合频繁地修改字符串。 2. abstract class 和 interface 有什么区别?方法重载与覆盖的区别? abstract class 和 ...

    Andriod的一个小程序

    15. **Gson和Jackson**: 这两个库用于JSON数据的序列化和反序列化,便于将网络响应转换为Java对象,或者将Java对象转换为JSON字符串发送到服务器。 "DouDemo-master"这个名字暗示可能是一个关于音乐、短视频或社交...

    基于ASE的android中间键开发

    该方法接收一个字符串参数并返回一个带有问候语的字符串。 通过以上步骤,开发者可以根据具体需求定制ASE的功能,从而更好地服务于特定的应用场景。ASE不仅简化了开发流程,也为非Java开发者提供了进入Android开发...

    xutils-3.0.jar包

    xutils中的`aapt`可能用于处理库中的资源文件,如图片、字符串、布局等,使其能够在Android应用中正确引用和使用。通过这个工具,xutils能够动态加载和管理资源,提高了代码的灵活性。 `res`目录包含了xutils的一些...

    Android开发_2年工作经验Android软件工程师求职简历个人简历.pdf

    3. **数据解析与网络操作**:他熟练使用PULL解析XML文件,并能够通过gson解析JSON字符串。同时,他掌握了使用HttpURLConnection、HttpClient、AsyncHttpClient框架和xUtils发送数据到服务器并接收JSON响应的技术。 ...

    jdk-13_linux-x64_bin.tar.gz

    - `include`:头文件,供C/C++编程时调用Java Native Interface (JNI)使用。 - `jmods`:Java模块系统相关的模块描述文件。 安装JDK 13在Linux上通常涉及解压文件,设置环境变量(如`JAVA_HOME`、`PATH`),并可能...

    phone+源文件

    2. **res**: 这个目录包含应用的所有资源,如XML布局文件、图片、字符串资源、颜色值等。开发者可以在这个目录下组织资源,Android系统在运行时会自动处理它们。 3. **META-INF**: 此目录包含关于APK包的元数据,...

Global site tag (gtag.js) - Google Analytics