Unity AndroidJNI разрешает классы, но не методы - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь взаимодействовать с нативными методами Android из C # в Unity с помощью AndroidJNI, однако я могу разрешать только классы, а не методы.

Я также использовал «более простые варианты», то есть интерфейс AndroidJavaClass, ноошибка говорит о том, что он пытается разрешить методы из java.lang.Object, поэтому я перешел на использование AndroidJNI, но застрял при разрешении методов.

У меня есть следующий метод Java public static String getParamsString2() { return "asd"; }

и следующий код c #, пытающийся разрешить идентификатор метода

 AndroidJNI.GetStaticMethodID(activityClass, "getParamsString2", "()Ljava/lang/String;");

Я подтвердил от декомпилятора, что подпись верна, однако я получаю следующую ошибку

 java.lang.NoSuchMethodError: no static method "Lfi/matalamaki/plugin/UnityPlayerActivity;.getParamsString2()Ljava/lang/String;

Когда я декомпилирую класс, на самом деле есть класс, который содержит метод

 public static getParamsString2() { //()Ljava/lang/String;
     L1 {
         ldc "asd" (java.lang.String)
         areturn
     }
 }

Класс также правильный, fi/matalamaki/plugin/UnityPlayerActivity

при использовании интерфейса AndroidJavaClass с кодом

    string referrer3 = new AndroidJavaClass("fi.matalamaki.plugin.UnityPlayerActivity").CallStatic<string>("getParamsString2", new object[0]);

Я получаю следующую ошибку AndroidJavaException: java.lang.NoSuchMethodError: no static method with name='getParamsString2' signature='()Ljava/lang/String;' in class Ljava.lang.Object; java.lang.NoSuchMethodError: no static method with name='getParamsString2' signature='()Ljava/lang/String;' in class Ljava.lang.Object;

, которая, кажется, указывает на то, что он пытается разрешить метод из java.lang.Object вместо моего собственного класса ..

Я пробовал разные комбинации параметров и типов возвращаемых данных, но не повезло ..

Я также проверил встроенный APK dex, декомпилировав его ..

1 Ответ

0 голосов
/ 23 сентября 2018

По-видимому, это был Proguard, который путем минимизации или запутывания удалил метод или переименовал его.Я понятия не имею, как после проверки я увидел там метод, но, возможно, я не обращал достаточно внимания, и его имя изменилось или около того.

После добавления исключения proguard в мой пакет и его поля иметодами проблема решена.

...