【问题标题】:JNI GetMethodID called with pending exception java.lang.ClassNotFoundException调用 JNI GetMethodID 并带有挂起的异常 java.lang.ClassNotFoundException
【发布时间】:2021-03-04 16:51:58
【问题描述】:

我正在开发一个 android 库 (.aar),它主要包含本地代码和一些 java 代码,主要是为应用程序代码提供 java 接口。

我有一个使用该库的演示应用程序,一切正常。

现在我要给这个库一个应该是 OEM 的人。他们正在开发一个利用这个库的(系统)应用程序。在他们的情况下,本机库在以下代码中抛出异常。

shapeClass = env->FindClass("xx/yy/zz/Shape");
addMethod = env->GetMethodID(shapeClass, "addPoint", "(FF)V");

这是他们得到的错误

JNI DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.ClassNotFoundException: Didn't find class "xx.yy.zz.Shape" on path: DexPathList[[zip file "/system/app/AA/AA.apk"],nativeLibraryDirectories=[/system/app/AA/lib/arm, /system/app/AA/AA.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/lib, /vendor/lib]]

我在谷歌上搜索并没有发现太多关于系统应用程序的不同之处。系统应用环境与常规应用环境有何不同?

请注意,上面两行代码是通过JNI接口从java包装代码中调用的。因此, (Shape) 类不可能没有加载,因为 Shape 类和调用类在同一个库中(同一个 .aar 文件)。

【问题讨论】:

  • 检查apk文件是否真的在/system/app/AA/AA.apk而不是其他位置。
  • 是的,apk 就在那个位置

标签: java android c++ java-native-interface


【解决方案1】:

系统应用程序必须将其本机库保存在 /system/lib 或 /vendor/lib 目录中。在某些情况下,原生库可能嵌入在 APK 文件中,但随后应用清单必须声明

android:extractNativeLibs=”false” 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多