Java libavcodec.so:具有文本重定位

Java libavcodec.so:具有文本重定位,java,android,metaio,Java,Android,Metaio,我正在Nexus5上测试Android 6.0,我正在使用Metaio(我知道该服务将于12月15日结束,但届时我们将转移到另一个AR平台)。 问题是,当我启动该活动时,会出现以下错误: 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

我正在Nexus5上测试Android 6.0,我正在使用Metaio(我知道该服务将于12月15日结束,但届时我们将转移到另一个AR平台)。 问题是,当我启动该活动时,会出现以下错误:

    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)
有人知道这个问题的可能解决方案吗,或者至少知道一个解决方法吗?
我正在努力寻找解决方案,但我不明白问题出在哪里。

今天,我在Nexus 6(摩托罗拉)上用Android 6.0测试我的应用程序时收到了相同的错误消息。我通过检查清单文件中的targetSDKVersion解决了我的问题。用“22”而不是“23”作为目标解决了这个问题。(见下文)

希望这对你有帮助。然而,目前这只是一个短期的解决办法,我希望我们能从metaio那里得到一些反馈

问候,,
christin

我收到了metaio SDK团队的反馈。他们说,metaio无法轻松解决这个问题,因为它与FFMpeg库有关。我们希望FFMpeg的更新能够解决这个问题。 我假设我们必须等待这样的更新,并在应用程序中交换库文件

我还没有寻找FFMpeg开发者联系论坛来进行查询或通知bug。你偶然认识一个吗


如果要求加载带有文本重新定位的共享库,christin会发出警告:

“libfoo.so有文本重定位。这是在浪费内存并防止 安全加固。请修复。“

尽管如此,操作系统还是会加载库。如果你的应用程序的目标SDK版本>=23,棉花糖将拒绝库。系统不再对此进行记录,因为它假定您的应用程序将记录dlopen(3)故障本身,并包含dlerror(3)中的文本,该文本确实解释了问题。不幸的是,在这种情况下,许多应用程序似乎捕获并隐藏System.loadLibrary抛出的
未满足链接错误,通常在您尝试调用一个本机方法并且VM抱怨它不存在之前,不会留下任何库加载失败的线索


可以使用命令行scanelf工具检查文本重新定位。你可以在网上找到关于这个问题的建议;例如,这是一个有用的指南。

好的,即使设置了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  
我从你那里拿到了最新的


您还需要在生成中的某个位置声明\u SECTION\u DATA\u REL\u RO,以便asm.S中的宏使用“动态重定位”选项。

您可以通过执行以下操作来检查共享lbirary是否具有文本重定位:

readelf -a path/to/yourlib.so | grep TEXTREL
如果它有文本重新定位,它将显示如下内容:

0x00000016 (TEXTREL)                    0x0
如果是这种情况,您可以使用以下可用资源重新编译共享库:

ndk-build -B -j 8

如果您再次检查,grep命令将不返回任何内容。

经过长时间的努力,并尝试以不同的方式编译FFmpeg,我找到了解决方案。确保使用--disable asm标志编译FFmpeg。这将确保FFmpeg不会有文本重定位,并且在针对Android M(SDK 23)进行编译时不会崩溃

为了确保它工作正常,您可以如上所述使用readelf


干杯

是的,我在iPad mini 1上试用了iOS 9。我的AREL应用程序按预期工作。我还尝试了我的一些junaio频道。到目前为止没有问题。我测试了像Glue、LB/GPS、GPS/方向跟踪、即时跟踪、扩展图像跟踪、虚拟跟踪之类的跟踪。像setTexture()这样的方法;startAnimation()+其他动画处理方法,如shareScreenshot()、startMovieTexture()正在工作。开始全屏电影了。反射贴图也被渲染。使用屏幕定位将三维模型设置为COS=0也在起作用。希望您的项目也一样。@user949884检查像素大小(应该是2的幂,比如512x512像素),试试方形PNG或非渐进式JPG。否则,在2015年12月15日之前,metaio帮助台仍然存在。您可以搜索并寻找答案,有很多类似的问题。@user949884或检查模型的网格以进行背面剔除。如果法线不指向外部,则模型的纹理将在应用于内部时显示为透明,并且背面是透明的。好的,降低targetSdkVersion的级别确实可以解决此问题。但如果我这么做,谷歌不会让我重新发布/更新我的应用程序。那么解决方案是什么?@Hiren dabi:我认为你必须自己将这些库(FFMPEG…)编译成一个共享对象(-.so),并将有问题的-.so库与更新的-.so库进行交换。至于我自己,我没有这样做,我不再和metaioSDK一起工作了。据我所知,仍然可以在Google Play上发布targetSDKversion=22的应用程序(Unity应用程序也可以)。但是,如果应用程序已发布版本23,则无法使用targetSDKversion 22。再次感谢您抽出时间!对不起,如果我没有告诉你消息,但我仍然没有收到来自Metaio团队的任何答复。不幸的是,我不知道任何FFMpeg论坛,所以我帮不了你。。我希望我们能得到最新消息,但我对此相当怀疑。。如果我有任何消息,我会在这里回答你!再次感谢!!我尝试了新更新的FFMpeg库。现在它给出了另一个错误:java.lang.unsatifiedLinkError:dlopen失败:无法找到“/data/app/it.productlab.card-1/lib/arm/libmetaiosdk.so”引用的符号“avcodec\u register\u all”。。。看起来libmetaiosd.so文件中有引用,这意味着所有so库都是与metaio库一起编译的,没有metaio现在就无法解决这个问题……可能是FFMpeg版本。非常感谢!!我会尽快测试,然后告诉你!对于那些完全不同分支的人,这里有一个链接,指向ffmpeg修复此问题的确切补丁,这确实解决了您的问题吗?我申请了t
0x00000016 (TEXTREL)                    0x0
ndk-build -B -j 8