Что такое разница между "AndroidJNI.FindClass" и "AndroidJavaClass" в Unity3D - PullRequest
0 голосов
/ 29 июня 2018

Я только начал узнавать о том, как подключить мой SDK, разработанный в Android, к моему проекту 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);

Сравните его с этим фрагментом кода, использующим класс AndroidJava: (с по этой ссылке )

 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 голосов
/ 06 февраля 2019

AndroidJavaClass - это просто удобный класс. Конечно, он использует AndroidJNI и AndroidJNIHelper для внутреннего использования.

AndroidJavaClass имеет метод GetRawClass(), и он вернет точно такое же значение IntPtr , что и AndroidJNI.FindClass().

Так зачем использовать AndroidJavaClass? Потому что это намного проще, коротко и читабельно. Кроме того, если вы хотите сохранить ссылку на возвращаемое значение AndroidJNI.FindClass(), вы можете позвонить на NewGlobalRef(), но с AndroidJavaClass вам вообще не нужно об этом беспокоиться.

Есть одна вещь, которую вы должны иметь в виду AndroidJavaClass. Вам нужно позвонить Dispose(), когда вы закончите с этим. Он реализует шаблон удаления, так что вы можете просто оставить его, и Dispose() будет вызываться автоматически перед сборкой моно, но это не рекомендуется. Если вы сами используете AndroidJNI.FindClass(), вам все равно нужно позвонить DeleteLocalRef().

0 голосов
/ 29 июня 2018

Я на 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

...