我正在开发一个 android 库 (.aar),它主要包含 native 代码和一些 java 代码,主要用于为应用程序代码提供 java 接口(interface)。
我有一个使用该库的演示应用程序,一切正常。
现在我给这个图书馆一个应该是 OEM 的人。他们正在开发一个利用这个库的(系统)应用程序。在他们的例子中, native 库在以下代码中抛出异常。
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 接口(interface)从 java 包装器代码中调用的。所以 (Shape) 类不可能没有加载,因为 Shape 类和调用类在同一个库中(同一个 .aar 文件)。
最佳答案
系统应用程序必须将其 native 库保存在/system/lib 或/vendor/lib 目录中。在某些情况下,原生库可能嵌入到 APK 文件中,但应用 list 必须声明
android:extractNativeLibs=”false”
关于java - JNI GetMethodID 调用时出现未决异常 java.lang.ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55833765/