我在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'
请帮帮我。
答案 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代码。
但是,如果您正在处理数组和字典,最好手动处理它们,因为在运行时可能会出现问题,而这些问题可能无法按预期传递。