我刚刚开始学习如何将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);
看起来两者都做同样的事情。它们之间有什么区别?
如果您能给我任何我能读到的关于这些的信息,那就太好了。
答案 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
答案 1 :(得分:1)
SyntaxError
只是一个便利班。
当然,它在内部使用AndroidJavaClass
和AndroidJNI
。
AndroidJNIHelper
具有AndroidJavaClass
方法,这将返回与GetRawClass()
相同的 IntPtr 值。
那为什么要使用AndroidJNI.FindClass()
?因为它更容易,简短和易读。
另外,如果要保留返回值AndroidJavaClass
的引用,则可能要调用AndroidJNI.FindClass()
,但使用NewGlobalRef()
时,则不必担心。
AndroidJavaClass
应该记住一件事。
完成操作后,您需要致电AndroidJavaClass
。它实现了处置模式,因此您可以保留它,Dispose()
将在Mono的GC之前自动调用,但是不建议这样做。
如果您自己直接使用Dispose()
,则仍然需要致电AndroidJNI.FindClass()
。