android - 在unity3d中调用android函数时出现错误java.lang.NoSuchMethodError?
问题描述
我的步骤:(1)在unity3d中,我添加了以下代码:
AndroidJavaClass jc = new
AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("Pay", "key");
(2) 将 Unity3d 项目导出到 Gradle(New),我得到一个包含活动文件的 gradle 项目:
- UnityPlayerActivity.java
- UnityPlayerNativeActivity.java
- UnityPlayerProxyActivity.java
在 AndroidManifest.xml 中,主要的活动是:
android:name="com.fs.game.UnityPlayerActivity"
(3) 我在文件 UnityPlayerActivity.java 中添加了一个 Pay 函数:
public void Pay(String key)
{
// test
}
(4) 最后,使用gradlew build
构建这个项目,并在我的手机中安装apk。但是当我点击测试按钮时,我得到了错误:
java.lang.NoSuchMethodError:在类 Lcom.fs.game.UnityPlayerActivity 中没有名称 = 'Pay' signature='(Ljava/lang/String;)V' 的非静态方法;
问题出在哪里?
解决方案
我认为你的代码是正确的。你用 gradle 构建它,而 gradle 默认有一个插件Proguard。Proguard 用于缩小或混淆代码,因此您的方法名称可能会因混淆而更改。
您应该:
1> 编辑build.gradle以禁用 proguard
2> 修改Proguard使用的txt文件(如proguard-android.txt、proguard-unity.txt),添加keep规则以保持你的类不被混淆。
推荐阅读
- php - 在 PDO 中动态 WHERE 子句查询后计算特定行数
- javascript - 在 ios14 中查看本地保存的 HTML5 和 javascript
- c# - 仅实现单个枚举的最佳方式 Moq IEnumerable
- sql - 用另一个字符串 SQL 替换其中带有单引号的字符串
- javascript - 使用 JavaScript 解密 RSA
- asp.net-core - MailKit.Security.SslHandshakeException:主机名与服务器 SSL 证书中给出的名称不匹配。asp.net 核心 5,nginx
- reactjs - 如何编写一个依赖于反应道具的计时器间隔?
- python - 如何获得 catboost 可视化以显示类别
- python - AttributeError:“张量”对象在 GPflow 中没有属性“ndim”
- maxima - wxMaxima: 将字符串代入函数会创建什么样的对象?