Unity3D中的“ AndroidJNI.FindClass”和“ AndroidJavaClass”之间的区别是什么

时间:2018-06-29 12:35:01

标签: c# unity3d java-native-interface android-unity-plugin

我刚刚开始学习如何将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);

看起来两者都做同样的事情。它们之间有什么区别?

如果您能给我任何我能读到的关于这些的信息,那就太好了。

2 个答案:

答案 0 :(得分:1)

我确定没有区别,哈。

来自AndroidJavaClass的文档-“这实质上意味着找到类类型并分配该特定类型的java.lang.Class对象。

看看AndroidJNI.FindClass的名称,它当然也试图找到一个类,但是它被卡在了“ JNI”中。我相信AndroidJavaClass将必须使用JNI,因为JNI是允许Java和Mono(Unity)相互交谈的机制。

所以,我假设两者都在使用JNI,并且都在寻找一个类。

相关链接:

https://docs.unity3d.com/ScriptReference/AndroidJNI.html

https://docs.unity3d.com/ScriptReference/AndroidJavaClass-ctor.html

https://developer.android.com/training/articles/perf-jni

答案 1 :(得分:1)

SyntaxError只是一个便利班。 当然,它在内部使用AndroidJavaClassAndroidJNI

AndroidJNIHelper具有AndroidJavaClass方法,这将返回与GetRawClass()相同的 IntPtr 值。

那为什么要使用AndroidJNI.FindClass()?因为它更容易,简短和易读。 另外,如果要保留返回值AndroidJavaClass的引用,则可能要调用AndroidJNI.FindClass(),但使用NewGlobalRef()时,则不必担心。

AndroidJavaClass应该记住一件事。 完成操作后,您需要致电AndroidJavaClass。它实现了处置模式,因此您可以保留它,Dispose()将在Mono的GC之前自动调用,但是不建议这样做。 如果您自己直接使用Dispose(),则仍然需要致电AndroidJNI.FindClass()