Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “之间的差异是什么?”;AndroidJNI.FindClass“;及;AndroidJavaClass“;在Unity3D中_C#_Unity3d_Java Native Interface_Android Unity Plugin - Fatal编程技术网

C# “之间的差异是什么?”;AndroidJNI.FindClass“;及;AndroidJavaClass“;在Unity3D中

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

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

将其与使用AndroidJavaClass的代码片段进行比较:(From)

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