如何在JNI中从c#传递参数到java方法

时间:2013-12-26 18:00:29

标签: android mono unity3d xamarin.android

我在Unity3D中工作,用C#编写脚本。我想从c#脚本调用我的java方法,它采用boolean类型的参数,但我不知道如何使用JNI从C#传递参数。我能够调用不带任何参数的方法。这就是我试过调用不带任何参数的方法,并且工作正常。

private int BtnMyAppWall;
// create a JavaClass object...
        IntPtr cls_JavaClass    = JNI.FindClass("com/example/unitybuttontry/MainActivity");
        int mid_JavaClass       = JNI.GetMethodID(cls_JavaClass, "<init>", "(Landroid/app/Activity;)V");
        IntPtr obj_JavaClass    = JNI.NewObject(cls_JavaClass, mid_JavaClass, obj_Activity);
        Debug.Log("JavaClass object = " + obj_JavaClass);

        // create a global reference to the JavaClass object and fetch method id(s)..
        JavaClass           = JNI.NewGlobalRef(obj_JavaClass);

BtnMyAppWall    = JNI.GetMethodID(cls_JavaClass, "myAppWall", "()Ljava/lang/String;");

// get the Java String object from the JavaClass object
        IntPtr str_cacheDir     = JNI.CallObjectMethod(JavaClass, BtnMyAppWall);

现在,如果我想传递布尔类型的参数,那么我需要更改我的最后两个语句:

  Stmt 1:  BtnMyAppWall = JNI.GetMethodID(cls_JavaClass, "myAppWall", "(Z)Ljava/lang/String;");

  Stmt 2:  // get the Java String object from the JavaClass object
            IntPtr str_cacheDir     = JNI.CallObjectMethod(JavaClass, BtnMyAppWall,true);

你可以在Stmt 1中看到,我已经提到'Z',这意味着我的方法将采用布尔参数,但在Stmt2中,当我传递我的值时,它会给出错误:

错误:无法转换object' expression to type System.IntPtr'

请帮帮我。

3 个答案:

答案 0 :(得分:1)

您需要使用Android.Runtime.JValue

// get the Java String object from the JavaClass object
IntPtr str_cacheDir = JNI.CallObjectMethod(obj_JavaClass, BtnMyAppWall, new JValue(true));

答案 1 :(得分:0)

使用Unity的JNI包装器(AndroidJavaObject和AndroidJavaClass),我会重写你的代码看起来像这样(虽然我们在插件中使用了这些包装器但未经过测试):

AndroidJavaObject obj = new AndroidJavaObject("com/example/unitybuttontry/MainActivity");
obj.CallMethod<string>("myAppWall", true);

答案 2 :(得分:0)

弗拉基米尔提到的是正确的。如果您只传递基本参数,如字符串,布尔值或活动,使用Unity的JNI包装器将不那么麻烦,而不是手动处理JNI代码。

但是,如果您正在处理数组和字典,最好手动处理它们,因为在运行时可能会出现问题,而这些问题可能无法按预期传递。