Java 在JNI中,如何访问JSONObject';从C++;,在其中输入一些值并返回?
现行代码 Java代码:Java 在JNI中,如何访问JSONObject';从C++;,在其中输入一些值并返回?,java,c++,java-native-interface,Java,C++,Java Native Interface,现行代码 Java代码: Using org.json.JSONObject; CPP代码: class sample { int val = 7; String str = "Hai"; public native void callCpp(JSONObject jo); public static void main(String args[]) { sample s = new sample();
Using org.json.JSONObject;
CPP代码:
class sample
{
int val = 7;
String str = "Hai";
public native void callCpp(JSONObject jo);
public static void main(String args[])
{
sample s = new sample();
JSONObject jo = new JSONObject();
jo.put("val",val);
jo.put("str",str);
s.callCpp(jo);
}
}
CPP代码:
void valFromCPP(JSONObject jo)
{
System.out.println("Val is :: " + jo.getInt("val"));
System.out.println("Str is :: " + jo.getString("str"));
}
即使我确定有放法,它返回“这个”,也就是那个对象。< /p>你的C++代码调用未定义的行为。它应该返回一个
jobject
,但您没有返回任何内容。实际上,您尝试过这样做。。不是调用方法,而是返回jobject。我现在就编辑不,这不是“尝试”的问题。必须从声明的C++函数返回一个值,以返回值。如果你不返回一个值,行为就会变得未定义。是的,我就是这么说的。。当我尝试返回对象时,我有了返回语句,我把“返回”部分改为方法调用,我忘记了在这里更新。@保尔麦肯齐更新了这个问题,请您通过这个,告诉我??,即使在那里,我也不能访问JSONORKET的“PUT”方法。您的C++代码调用未定义的行为。它应该返回一个jobject
,但您没有返回任何内容。实际上,您尝试过这样做。。不是调用方法,而是返回jobject。我现在就编辑不,这不是“尝试”的问题。必须从声明的C++函数返回一个值,以返回值。如果你不返回一个值,行为就会变得未定义。是的,我就是这么说的。。当我尝试返回对象时,我有一个返回语句,我将“返回”部分更改为方法调用,但我忘了在这里更新。@PaulMcKenzie我更新了问题,请您检查一下并告诉我,我无法从JSONObject访问“put”方法,即使它在那里。
void valFromCPP(JSONObject jo)
{
System.out.println("Val is :: " + jo.getInt("val"));
System.out.println("Str is :: " + jo.getString("str"));
}
JNIEXPORT void JNICALL Java_sample_disp(JNIEnv *env, jobject cobj, jobject jsonjobj)
{
jclass jsoncls = env->FindClass("org/json/JSONObject");
jclass ccls = env->GetObjectClass(cobj);
jobject newObj;
jmethodID constructorID = env->GetMethodID(jsoncls,"<init>","()V");
newObj = env->NewObject(jsoncls, constructorID);
jmethodID putStringID = env->GetMethodID(jsoncls, "put", "(Ljava/lang/String;Ljava/lang/Object;)Lorg/json/JSONObject;");
if(putStringID == NULL)
{
printf("\n putStringID not created!\n");
return;
}
jmethodID putIntID = env->GetMethodID(jsoncls, "put", "(Ljava/lang/String;I)Lorg/json/JSONObject;");
jmethodID valFromCPPId = env->GetMethodID(ccls, "valFromCPP", "(Lorg/json/JSONObject;)V");
newObj = env->CallObjectMethod(newObj, putStringID, env->NewStringUTF("str"), env->NewStringUTF("Hai"));
newObj = env->CallObjectMethod(newObj, putIntID, env->NewStringUTF("val"), 7);
env->CallVoidMethod(cobj, valFromCPPId, newObj);
}
putStringID Not Created
Exception in thread "main" java.lang.NoSuchMethodError: put