C# “之间的差异是什么?”;AndroidJNI.FindClass“;及;AndroidJavaClass“;在Unity3D中
我刚刚开始学习如何将Android开发的SDK连接到Unity3D项目。 但是JNI和像AndroidJNI这样的统一类对我来说仍然很模糊。 例如,请参阅下面使用AndroidJNI.FindClass的代码:(From) 将其与使用AndroidJavaClass的代码片段进行比较:(From)C# “之间的差异是什么?”;AndroidJNI.FindClass“;及;AndroidJavaClass“;在Unity3D中,c#,unity3d,java-native-interface,android-unity-plugin,C#,Unity3d,Java Native Interface,Android Unity Plugin,我刚刚开始学习如何将Android开发的SDK连接到Unity3D项目。 但是JNI和像AndroidJNI这样的统一类对我来说仍然很模糊。 例如,请参阅下面使用AndroidJNI.FindClass的代码:(From) 将其与使用AndroidJavaClass的代码片段进行比较:(From) 私有AndroidJavaClass ajc; 私有AndroidJavaObject ajo; AndroidJavaClass jc=新的AndroidJavaClass(“com.unity3d
私有AndroidJavaClass ajc;
私有AndroidJavaObject ajo;
AndroidJavaClass jc=新的AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
ajo=jc.GetStatic(“当前活动”);
var exampleSDK=newandroidjavaclass(“com.example.sdk.exampleSDK”);
var videoObj=新的AndroidJavaObject(“com.example.sdk.VidoSchema”);
CallStatic(“lanuchSDKMethod”,ajo,SERIAL,videoObj);
看起来这两者的作用是一样的。他们之间有什么区别
另外,如果你能给我任何我能读到的关于这些的东西,那就太好了。我99%肯定没有区别,哈 从AndroidJavaClass的文档中可以看出——“这本质上意味着定位类类型并分配该特定类型的java.lang.class对象。” 查看AndroidJNI.FindClass名称,它当然也试图定位一个类,但它的“JNI”卡在那里。我相信AndroidJavaClass必须使用JNI,因为JNI是允许Java和Mono(Unity)相互通信的机制 所以,我假设两者都在使用JNI,并且都在查找一个类 相关链接:
AndroidJavaClass
只是一个方便的类。
当然,它在内部使用了AndroidJNI
和AndroidJNIHelper
AndroidJavaClass
有GetRawClass()
方法,它将返回与AndroidJNI.FindClass()
完全相同的IntPtr值
那么为什么要使用AndroidJavaClass
?因为它更简单,简短,易读。
另外,如果您想保留返回值为AndroidJNI.FindClass()
的引用,您可能需要调用NewGlobalRef()
,但是使用AndroidJavaClass
,您根本不必担心它
对于AndroidJavaClass
,您应该记住一件事。
完成后需要调用Dispose()
。它实现了一个dispose模式,因此您可以将其保留,在Mono的GC之前将自动调用dispose()
,但不建议这样做。
如果您自己直接使用AndroidJNI.FindClass()
,您仍然需要调用DeleteLocalRef()
cls_Activity = AndroidJNI.FindClass("com/unity3d/player/UnityPlayer");
fid_Activity = AndroidJNI.GetStaticFieldID(cls_Activity, "currentActivity", "Landroid/app/Activity;");
obj_Activity = AndroidJNI.GetStaticObjectField(cls_Activity, fid_Activity);
kdataActivityClass = AndroidJNI.FindClass("com/kdata/unitytest/UnityUrlPlugin");
startAdsMethod = AndroidJNI.GetMethodID(kdataActivityClass,"getURL","(I)Ljava/lang/String;");
jvalue[] myArray = new jvalue[1];
myArray[0].i =testvalue;
gui.text= AndroidJNI.CallStaticStringMethod(obj_Activity, startAdsMethod, myArray);
private AndroidJavaClass ajc;
private AndroidJavaObject ajo;
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
ajo = jc.GetStatic<AndroidJavaObject>("currentActivity");
var exampleSDK = new AndroidJavaClass("com.example.sdk.ExampleSDK");
var videoObj = new AndroidJavaObject("com.example.sdk.VidoSchema");
exampleSDK.CallStatic("lanuchSDKMethod", ajo, SERIAL, videoObj);