我在Nexus 5上测试Android 6.0,我正在使用Metaio(我知道该服务将在12月15日结束,但到那时我们将转移到另一个AR平台)。 问题是,当我启动ARActivity时,我收到以下错误:
09-02 08:45:11.138: E/AndroidRuntime(6141): java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/com.myapp.myapp/lib/arm/libavcodec.so: has text relocations
09-02 08:45:11.138: E/AndroidRuntime(6141): at java.lang.Runtime.loadLibrary(Runtime.java:372)
09-02 08:45:11.138: E/AndroidRuntime(6141): at java.lang.System.loadLibrary(System.java:1076)
09-02 08:45:11.138: E/AndroidRuntime(6141): at com.metaio.sdk.jni.IMetaioSDKAndroid.loadNativeLibs(IMetaioSDKAndroid.java:54)
09-02 08:45:11.138: E/AndroidRuntime(6141): at metaioCloudPlugin.SplashActivity.loadNativeLibs(SplashActivity.java:37)
09-02 08:45:11.138: E/AndroidRuntime(6141): at metaioCloudPlugin.SplashActivity.onCreate(SplashActivity.java:68)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.Activity.performCreate(Activity.java:6237)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.-wrap11(ActivityThread.java)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.os.Handler.dispatchMessage(Handler.java:102)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.os.Looper.loop(Looper.java:148)
09-02 08:45:11.138: E/AndroidRuntime(6141): at android.app.ActivityThread.main(ActivityThread.java:5417)
09-02 08:45:11.138: E/AndroidRuntime(6141): at java.lang.reflect.Method.invoke(Native Method)
09-02 08:45:11.138: E/AndroidRuntime(6141): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
09-02 08:45:11.138: E/AndroidRuntime(6141): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
有没有人知道这个或至少是一种解决方法的可能解决方案? 我很难找到解决办法,但我无法理解问题所在。
答案 0 :(得分:43)
今天,在Nexus 6(Motorola)上使用Android 6.0测试我的应用时,我收到了相同的错误消息。我通过检查清单文件中的targetSDKVersion解决了我的问题。使用“22”而非“23”作为targetSDKVersion解决了它。 (见下文)
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="22" />
我还检查了编译版本和targetSDKversion的build.gradle文件:
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
minSdkVersion 15
targetSdkVersion 22
}
希望这会对你有所帮助。但是,现在这只是一个短期的解决方法,我希望我们会从metaio获得一些反馈。
此致 克里斯廷
答案 1 :(得分:12)
如果要求加载具有文本重定位的共享库,则以前版本的Android会发出警告:
&#34; libfoo.so有文本重定位。这会浪费记忆并阻止 安全加固。请修理。&#34;。
尽管如此,操作系统仍将加载库。如果您的应用的目标SDK版本是&gt; = 23,Marshmallow会拒绝库。系统不再记录此内容,因为它假定您的应用会记录dlopen(3)失败本身,并包含来自dlerror(3)的文本确实解释了这个问题。不幸的是,在这种情况下,许多应用程序似乎捕获并隐藏UnsatisfiedLinkError throw by System.loadLibrary
,通常不会发现库无法加载,直到您尝试调用其中一种本机方法并且VM抱怨它为止不存在。
您可以使用命令行scanelf工具检查文本重定位。您可以在互联网上找到有关该主题的建议;例如https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide是一个有用的指南。
答案 2 :(得分:12)
好的,即使设置了targetSDK 23,我也能在这里工作。
对于我和我的分支,需要修补的五个文件是
libavcodec\arm\fft_fixed_neon.S
libavcodec\arm\fft_neon.S
libavcodec\arm\fft_vfp.S
libavcodec\arm\mlpdsp_armv5te.S
libutil\arm\asm.S
我从https://github.com/FFmpeg/FFmpeg
获取最新信息您还需要在构建中的某个地方为am.S中的宏声明HAVE_SECTION_DATA_REL_RO,以使用动态重定位选项。
答案 3 :(得分:11)
您可以通过以下方式检查您的共享lbirary是否有文本重定位:
readelf -a path/to/yourlib.so | grep TEXTREL
如果它有文本重定位,它会显示如下:
0x00000016 (TEXTREL) 0x0
如果是这种情况,您可以使用latest NDK version重新编译共享库:
ndk-build -B -j 8
如果再次检查,grep命令将不返回任何内容。
答案 4 :(得分:6)
经过很长一段时间的努力并试图以不同的方式编译FFmpeg,我找到了解决方案。确保使用--disable-asm标志编译FFmpeg。这将确保FFmpeg在编译Android M(SDK 23)时不会进行文本重定位并且不会崩溃
为了确保它有效,您可以使用上面提到的readelf。
干杯
答案 5 :(得分:2)
我收到了metaio SDK团队的反馈。他们说metaio不能轻易解决这个问题,因为它与FFMpeg库有关。我们不得不希望更新FFMpeg来解决这个问题。 我假设我们必须等待这样的更新并在应用程序中交换库文件。
我还没有找过FFMpeg开发者联系论坛来查询或通知错误。你偶然知道吗?
最佳回归曲,克里斯汀