java.lang.UnsatisfiedLinkError:启用proguard后,找不到java.lang.String的实现

时间:2019-07-09 08:07:55

标签: java android c++

启用proguard时出现以下错误。

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.osolutions.otv.utilities.al.b() (tried Java_com_osolutions_otv_utilities_al_b and Java_com_osolutions_otv_utilities_al_b__)
   at com.osolutions.otv.utilities.al.b(Native Method)
   at com.osolutions.otv.utilities.al.<clinit>(Unknown Source)
   at com.osolutions.otv.activity.SplashScreenActivity.a(Unknown Source)
   at com.osolutions.otv.activity.y.run(Unknown Source)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:7331)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

我也使用

初始化了Cpp类
static {
     System.loadLibrary("baseUrl");
}

如果我禁用了proguard,它将正常工作。启用proguard就是这种情况。

1 个答案:

答案 0 :(得分:1)

就像@Botje所建议的那样,看来您的问题是Java端的本地名称和方法的定义不同步。

您的public native String myMethod();被ProGuard更改为public native String b();,但是您的本机实现保留了原始名称。这就是Java运行时找不到它的原因。

您需要将以下内容添加到ProGuard文件中:

-keepclasseswithmembernames,includedescriptorclasses class * {
    native <methods>;
}

请不要将此答案标记为解决方案,因为它是@Botje附带的(我只是进一步解释了此问题)。

@Botje请添加您自己的答案,以便他可以将其标记为解决方案。