2

我刚开始学习如何将我在 Android 中开发的 SDK 连接到我的 Unity3D 项目。但是像 AndroidJNI 这样的 JNI 和 Unity 类对我来说仍然很模糊。例如,请参阅下面使用 AndroidJNI.FindClass 的代码:(来自这篇文章

        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 的代码片段进行比较:(来自此链接

 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);

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

另外,如果你能给我任何我能读到的关于这些的东西,那就太好了。

4

2 回答 2

3

AndroidJavaClass只是一个方便类。当然它使用AndroidJNIAndroidJNIHelper内部。

AndroidJavaClasshas方法,这将返回与'sGetRawClass()完全相同的IntPtr值。AndroidJNI.FindClass()

那么为什么要使用AndroidJavaClass呢?因为它更容易、更简短、更易读。此外,如果您想保留 的返回值的引用AndroidJNI.FindClass(),您可能需要调用NewGlobalRef()但使用AndroidJavaClass,您根本不必担心。

您应该记住一件事AndroidJavaClass。完成后需要打电话Dispose()。它实现了一个 dispose 模式,所以你可以离开它,它Dispose()会在 Mono 的 GC 之前被自动调用,但不推荐这样做。如果你自己直接使用,无论如何AndroidJNI.FindClass()都需要调用。DeleteLocalRef()

于 2019-02-06T19:42:12.533 回答
1

我 99% 确定没有区别,哈。

来自 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

于 2018-06-29T19:32:22.367 回答