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);
这句话穿入的参数是正确的,返回的却为空。
还请各位不吝赐教!!
相关推荐
当JNI方法执行完毕后,它会返回一个JSON字符串,你可以再次使用Java的JSON库将其反序列化为Java对象。 8. **性能优化**: 跨语言数据传递可能会有性能开销,特别是在频繁交互时。考虑使用数据缓冲区或一次性处理...
2. **JSON在JNI中的应用**:为了在Java和C++之间传递JSON数据,通常需要将JSON字符串作为参数传入JNI函数,然后在C++端解析这个字符串。可以使用开源库如`nlohmann/json`在C++中处理JSON。 3. **数据转换**:在Java...
这个例子演示了如何在C++中使用jsoncpp解析JSON字符串,并将其结果返回到Java层。实际项目中,你可以根据需求修改这个例子,实现序列化、反序列化、修改JSON数据等操作。通过这种方式,你可以利用C++的性能优势来...
在Java层,可以使用Gson或Jackson等库将接收到的JSON字符串转化为Java对象。 总结来说,Android Studio中的JNI学习涉及项目配置、数据类型转化、本地方法调用以及可能的JSON操作。理解这些基础知识是掌握JNI的关键...
jsoncpp是一个开源库,用于C++和C语言处理JSON数据,它提供了解析JSON字符串、序列化对象到JSON以及在C++对象和JSON之间转换的功能。 在"TestCurlJson"这个压缩包中,很可能包含了一个示例项目,演示如何在MFC程序...
JsonCpp库提供了一套完整的API,包括解析JSON字符串、生成JSON字符串、以及在JSON对象和C++数据结构之间转换的功能。其主要优点在于执行速度快,内存占用少,特别适合处理大规模的JSON数据。移植JsonCpp到Android...
在Java层创建一个JNI接口,声明需要调用的C++函数,比如解析JSON字符串: ```java public class MyJNI { static { System.loadLibrary("myjni"); } public native String parseJsonString(String jsonString);...
1. **JSON解析**:`JSONObject`提供了一系列的方法来解析JSON字符串,例如`new JSONObject(jsonString)`用于从JSON字符串构造一个`JSONObject`实例。 2. **字段访问**:你可以通过键值对的方式获取或设置`...
在C语言中,cJson可以高效地处理JSON字符串,将其转化为C结构体,也可以将C结构体编码为JSON字符串。 在这个项目中,cJson被集成到了Lua环境中,这意味着Lua脚本可以直接处理JSON数据。开发者可以通过Lua编写脚本来...
// 解析JSON字符串 std::string jsonString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; rapidjson::Document doc; doc.Parse(jsonString.c_str()); // 访问JSON对象 if (doc.IsObject()) { ...
在Java中,有许多JSON库,如Jackson、Gson、org.json等,它们提供了将Java对象转换为JSON字符串以及反序列化JSON到Java对象的功能。 6. **jstl**: JSTL(JavaServer Pages Standard Tag Library)是一组标准标签...
3. `res`:包含了应用的资源文件,如布局、图标、字符串等。 二、书籍解析技术 FBReader支持多种格式的电子书,如EPUB、FB2、MOBI等。其解析过程涉及XML解析、ZIP解压等技术。对于EPUB,FBReader会解析OPF和NCX...
String 和 StringBuilder 都是字符串操作类,String 是不可变的,而 StringBuilder 是可变的,适合频繁地修改字符串。 2. abstract class 和 interface 有什么区别?方法重载与覆盖的区别? abstract class 和 ...
15. **Gson和Jackson**: 这两个库用于JSON数据的序列化和反序列化,便于将网络响应转换为Java对象,或者将Java对象转换为JSON字符串发送到服务器。 "DouDemo-master"这个名字暗示可能是一个关于音乐、短视频或社交...
该方法接收一个字符串参数并返回一个带有问候语的字符串。 通过以上步骤,开发者可以根据具体需求定制ASE的功能,从而更好地服务于特定的应用场景。ASE不仅简化了开发流程,也为非Java开发者提供了进入Android开发...
xutils中的`aapt`可能用于处理库中的资源文件,如图片、字符串、布局等,使其能够在Android应用中正确引用和使用。通过这个工具,xutils能够动态加载和管理资源,提高了代码的灵活性。 `res`目录包含了xutils的一些...
3. **数据解析与网络操作**:他熟练使用PULL解析XML文件,并能够通过gson解析JSON字符串。同时,他掌握了使用HttpURLConnection、HttpClient、AsyncHttpClient框架和xUtils发送数据到服务器并接收JSON响应的技术。 ...
- `include`:头文件,供C/C++编程时调用Java Native Interface (JNI)使用。 - `jmods`:Java模块系统相关的模块描述文件。 安装JDK 13在Linux上通常涉及解压文件,设置环境变量(如`JAVA_HOME`、`PATH`),并可能...
2. **res**: 这个目录包含应用的所有资源,如XML布局文件、图片、字符串资源、颜色值等。开发者可以在这个目录下组织资源,Android系统在运行时会自动处理它们。 3. **META-INF**: 此目录包含关于APK包的元数据,...