Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android L上的本机应用程序崩溃_Android_Android Ndk_Android 5.0 Lollipop - Fatal编程技术网

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

我有一个本机应用程序,它总是在Android KitKat上运行DalivikART运行时,但现在它在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中的艺术运行时与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+?