Android L上的本机应用程序崩溃
我有一个本机应用程序,它总是在Android KitKat上运行Dalivik和ART运行时,但现在它在Android L上崩溃,出现以下跟踪:Android L上的本机应用程序崩溃,android,android-ndk,android-5.0-lollipop,Android,Android Ndk,Android 5.0 Lollipop,我有一个本机应用程序,它总是在Android KitKat上运行Dalivik和ART运行时,但现在它在Android L上崩溃,出现以下跟踪: E/art(12810): dlopen("/data/app-lib/com.mylib.example", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "issetugid" referenced by "mylib.so"... D/AndroidRuntime(12810): S
E/art(12810): dlopen("/data/app-lib/com.mylib.example", RTLD_LAZY) failed: dlopen failed: cannot locate symbol "issetugid" referenced by "mylib.so"...
D/AndroidRuntime(12810): Shutting down VM
E/AndroidRuntime(12810): FATAL EXCEPTION: main
E/AndroidRuntime(12810): Process: com.mylib.example, PID: 12810
E/AndroidRuntime(12810): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "issetugid" referenced by "mylib.so"...
E/AndroidRuntime(12810): at java.lang.Runtime.loadLibrary(Runtime.java:364)
E/AndroidRuntime(12810): at java.lang.System.loadLibrary(System.java:610)
Android L中的艺术运行时与KitKat不同吗?现在还没有新的NDK可用,因此,如何避免此崩溃,因为似乎不再支持函数
issetugid
。我想我可能有答案,如果我错了,请纠正我。我曾经遇到过类似的问题,现在它已修复(或者我找到了解决方法)
在向JNI注册本机方法时,有两种方法
1) 在.cpp文件中实现JNI_OnLoad()方法,并将本机方法注册到
适当的课程。
检查-
示例-
2) 本机方法需要遵循特定的命名约定,其中必须添加类路径(包括包)。
检查-
在这里,我们不需要实现任何方法。JVM从二进制文件中的符号名称中发现本机方法
第一种方法在Android ART运行时似乎不起作用(ART在kitkat中是可选的,它将是Lolipop中唯一的运行时)。我不确定为什么它不起作用。但我认为原因在于ART的执行方式(字节码是在安装时转换和缓存的,而不是在运行时,这样应用程序运行得更快)。因此,由于未加载本机lib(未调用on_load),因此到机器代码的转换在某个点失败
使用第二种方法注册本地人。它应该会起作用。
唯一的缺点是现在你的函数名将是长的,看起来很可怕(我打赌没有一个函数能满足100char的限制)
希望这有帮助
干杯,
Shrish这个问题已经在最终的Android 5.0版本中修复。不需要重新编译现有的二进制文件
但是,如果本机库是使用targetandroid-21编译的,则在以前的android版本(<5.0)上会失败。在这里查看相关代码可能会有所帮助?它只是无法加载本机库。啊,好的。我是个白痴。我没有看到错误。。在你短暂的追踪中,这就像白天一样简单。。。别理我!还有一个bug现在是不是很快就会有修复或者我们应该回到4.4.4?你所说的“第二种方法”是Android上的JNI最初的工作方式;如果您真的遇到了100个字符的限制,您可能需要重新考虑名称空间的可读性。更重要的是,这些注释似乎不太可能与问题中相当具体的错误有关。更具体地说,这个问题的核心问题是当函数从动态链接更改为声明为内联或宏时,这样,它的实现应该自动包含在客户端程序的构建中,而不是由动态库提供。海报的现有构建假定它将在运行时由动态库提供。但是他们的新设备假定它应该包含在客户端程序中(并且不在库中提供),因此导致不兼容。arsalank2,那么你只是保持目标不变?是的,我使用android-19支持以前的版本。所以你编译了两次?或者你是说你的目标是android-19支持包括android 5.0在内的所有设备?你是如何定位所有设备的?不,我用目标android-19编译了一次,以支持所有设备。所以用目标android-19编译可以在所有API级别上工作,比如API 9+?