我有一个本机应用程序,它始终在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): 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中的ART运行时是否与KitKat不同?目前还没有新的NDK可用,因此,如何避免此崩溃,因为似乎不再支持函数issetugid
。
答案 0 :(得分:1)
此问题已在最终的Android 5.0版本中修复。没有必要重新编译现有的二进制文件。
但是,如果使用目标 android-21 编译本机lib,则在之前的Android版本(< 5.0)
上会失败答案 1 :(得分:0)
我想我可能有答案,如果我错了,请纠正我。我遇到了类似的问题,现在已经修复了(或者我找到了解决办法)
在向JNI注册本机方法时,有两种方法可以实现。
1)在.cpp文件中实现JNI_OnLoad()方法并使用 适当的课程。 检查 - http://developer.android.com/training/articles/perf-jni.html#native_libraries 示例 - https://android.googlesource.com/platform/development/+/master/samples/SimpleJNI/jni/native.cpp
2)本机方法有一个特定的命名约定,其中必须添加类路径(包括包)。 检查 - http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp615 这里我们不需要实现任何方法。 JVM从二进制文件中的符号名称中发现本机方法。
第一种方法在Android ART运行时似乎不起作用(ART在kitkat中是可选的,它将是Lolipop中唯一的运行时)。我不确定它为什么不起作用。但我认为原因是因为ART的执行方式。(字节码在安装时自身而不是运行时进行转换和缓存,因此应用程序运行得更快)。因此,由于未加载本机库(未调用on_load),因此在某些时候转换为机器代码失败
使用第二种方法注册本机。它应该工作。 现在唯一的缺点就是你的函数名称会长而且看起来很糟糕(我敢打赌这个函数都不适合100char的限制).bye bye函数名可读性。
希望这有帮助
干杯, Shrish