我刚刚开始学习如何将我在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);
看起来这两者都做同样的事情。它们之间有什么区别?
另外,如果你能给我任何我能读到的关于这些的东西,那就太好了。
AndroidJavaClass
只是一个方便的类。 当然,它在内部使用AndroidJNI
和AndroidJNIHelper
。
AndroidJavaClass
有GetRawClass()
方法,这将返回与AndroidJNI.FindClass()
完全相同的IntPtr值。
那么为什么要使用AndroidJavaClass
呢?因为它更容易、简短且可读。 另外,如果你想保留一个返回值的引用AndroidJNI.FindClass()
,你可能想调用NewGlobalRef()
但使用AndroidJavaClass
,你根本不用担心它。
AndroidJavaClass
您应该记住一件事。 完成后,您需要调用Dispose()
。它实现了释放模式,因此您可以保留它,Dispose()
将在 Mono 的 GC 之前自动调用,但不建议这样做。 如果您自己直接使用AndroidJNI.FindClass()
,无论如何都需要拨打DeleteLocalRef()
。
我 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