我刚刚开始学习如何将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只是一个便利班。
当然,它在内部使用AndroidJNIAndroidJNIHelper

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/

10-12 05:50