Java 在JNI中,如何访问JSONObject';从C++;,在其中输入一些值并返回?

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();

现行代码

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();  
        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