原生应用程序在Android L上崩溃

时间:2014-06-27 12:46:01

标签: 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): 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

2 个答案:

答案 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