Unity调用Android代码
方法一:
//using让 Local Ref 回收
using(AndroidJavaClass javaClazz = new AndroidJavaClass("com.ddianle.Bitmap"))
{
int res = javaClazz.CallStatic<int>("DrawText", 'a');//调用静态方法
}
public static int DrawText(char c)
{
return 1;
}
Unity调用Java方法时,参数或者返回值最好是Byte或者Byte[]。
此方法的缺点是在Android平台容易造成Local Ref > 512的溢出Bug。(因为自己无法手动删除Local Ref)
方法二:
public static byte[] DrawText(String str, byte[] b)
{
return null;
}
IntPtr clazzPtr = AndroidJNI.FindClass("com/ddianle/Bitmap");
IntPtr methodPtr = AndroidJNI.GetStaticMethodID(clazzPtr, "DrawText", "(Ljava.lang.String;[B)[B");
//Two param
IntPtr v1 = AndroidJNI.NewStringUTF("abc");
jvalue j1 = new jvalue();
j1.l = v1;
IntPtr v2 = AndroidJNI.ToByteArray(Encoding.Default.GetBytes("abc"));
jvalue j2 = new jvalue();
j1.l = v2;
IntPtr resPtr = AndroidJNI.CallStaticObjectMethod(clazzPtr, methodPtr, new jvalue[]{j1, j2 });//调用
byte[] b = AndroidJNI.FromByteArray(resPtr);
//...
//删除Local Ref。methodPtr不需要手动删除,因为它不是一个jobject对象。
AndroidJNI.DeleteLocalRef(clazzPtr);
AndroidJNI.DeleteLocalRef(v1);
AndroidJNI.DeleteLocalRef(v2);
AndroidJNI.DeleteLocalRef(resPtr);
该方法可以手动的删除Local Ref,不过代码比较繁琐.
本文介绍了两种Unity中调用Android代码的方法。方法一使用LocalRef自动回收,但易触发LocalRef数量限制Bug。方法二手动管理LocalRef,虽代码复杂,但避免了溢出问题。建议参数和返回值使用Byte或Byte[]。
3449

被折叠的 条评论
为什么被折叠?



