我正在尝试使用AndroidJNI与来自Unity中C#的本地Android方法进行交互,但是我只能解析类,而不能解析方法。
我还使用了“较简单的变体”,即AndroidJavaClass接口,但错误表明它试图从java.lang.Object解析方法,因此我继续使用AndroidJNI,但仍无法解析这些方法。
我有以下java方法
public static String getParamsString2() {
return "asd";
}
和以下c#代码尝试解析方法ID
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。
答案 0 :(得分:0)
很明显,是Proguard通过最小化或混淆来删除或重命名了该方法。我不知道在验证之后如何看到那里的方法,但是也许我没有引起足够的重视,并且它的名称被更改了。
在我的软件包及其字段和方法上添加了proguard排除之后,现在可以解决问题。