我正在开发一个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]]
我搜索了Google,但没有发现关于系统应用程序差异的更多信息。系统应用程序环境与常规应用程序环境有何不同?
请注意,以上两行代码是通过JNI接口从Java包装器代码中调用的。因此,因为Shape类和调用类在同一个库(相同的.aar文件)中,所以没有机会不加载(Shape)类。
答案 0 :(得分:0)
系统应用程序必须将其本机库保留在/ system / lib或/ vendor / lib目录中。在某些情况下,本机库可能嵌入在APK文件中,但是应用清单必须声明
android:extractNativeLibs=”false”