我刚刚开始学习如何将Android开发的SDK连接到Unity3D项目。
但是JNI和Unity类(例如AndroidJNI)对我来说仍然很模糊。
例如,请参见使用AndroidJNI.FindClass的以下代码:(来自This Post)
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);
将此代码与使用AndroidJavaClass的代码段进行比较:(来自This Link)
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);
看起来两者都做同样的事情。它们之间有什么区别?
另外,如果您能给我任何我能读到的关于这些的信息,那就太好了。
最佳答案
AndroidJavaClass
只是一个便利班。
当然,它在内部使用AndroidJNI
和AndroidJNIHelper
。AndroidJavaClass
具有GetRawClass()
方法,这将返回与AndroidJNI.FindClass()
完全相同的IntPtr值。
那么为什么要使用AndroidJavaClass
?因为它更容易,简短和易读。
另外,如果要保留返回值AndroidJNI.FindClass()
的引用,则可能要调用NewGlobalRef()
,但使用AndroidJavaClass
,则完全不必担心。AndroidJavaClass
应该记住一件事。
完成后,您需要调用Dispose()
。它实现了处置模式,因此您可以将其保留下来,并且Dispose()
将在Mono的GC之前自动调用,但是不建议这样做。
如果直接自己使用AndroidJNI.FindClass()
,则仍然需要致电DeleteLocalRef()
。
关于c# - Unity3D中的“AndroidJNI.FindClass”和“AndroidJavaClass”之间的区别是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51101892/