• 华为旧手机多媒体控件问题


    今天处理了一台华为的旧手机,具体型号就不说了,应该是某个朋友50包邮收的二手手机,系统版本是Emui 3.3, Android 5.1,对应的就是Android Lollipop。

    具体的问题出现在哪里呢?

    就是在调用MediaCodec库的方法时,会出现一个错误。

    1. //出错代码行
    2. MediaCodec codec = MediaCodec.createEncoderByType(MediaFormat.MIMETYPE_VIDEO_AVC);
    3. //错误捕获堆栈
    4. java.lang.UnsatisfiedLinkError: Library media_jni not found; tried [/system/lib64/libmedia_jni.so, /system/product/lib64/libmedia_jni.so, /data/local/tmp/libmedia_jni.so]
    5. at java.lang.Runtime.loadLibrary(Runtime.java:407)
    6. at java.lang.System.loadLibrary(System.java:997)
    7. at android.media.MediaCodec.<clinit>(MediaCodec.java:1695)
    8. at com.xxxxx.xxx.Server.scrcpy(Server.java:27)
    9. at com.xxxxx.xxx.Server.main(Server.java:313)
    10. at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)

            很明显地可以看出,在调用MeiaCodec的方法时,实际上是通过jni的方法调用了Framework里已经编译好了的so文件里面的方法,这边缺少的就是libmeia_jni.so。那么问题就很好解决了,只需要找到这样的.so文件就行。

            我们在github上面搜索这个文件,很容易的看到了,GitHub - pfalcon/android-platform-headers: Collection of platform headers and link libs for all versions of Android. (repo is rebased, see wiki)

    这个项目里面就有对应的.so文件。我们只需要随便adb push到 [/system/lib64, /system/product/lib64, /data/local/tmp]的任何一个文件夹里就行了。

    但是

    1. java.lang.UnsatisfiedLinkError: Bad JNI version returned from JNI_OnLoad in "/data/local/tmp/libmedia_jni.so": -1203148328
    2. at java.lang.Runtime.loadLibrary(Runtime.java:405)
    3. at java.lang.System.loadLibrary(System.java:997)
    4. at android.media.MediaCodec.<clinit>(MediaCodec.java:1695)
    5. at com.xxxxxx.xxx.Server.scrcpy(Server.java:27)
    6. at com.xxxxxx.xxx.Server.main(Server.java:313)
    7. at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    8. at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)

    合着这样一个jni还在load的过程中定义了“版本号”,版本号不对就会报错。 这就很尴尬了。要么得升系统,要么我得自己编译一下这个.so。或者干脆用二进制的方法打开直接修改这个“版本号”?

    解决

    由于之前对于Android研究不深,不是很懂这些.so文件都应该预置在系统中,不过根据几次做逆向的经验来看,有一定的概率在 /system/lib里面存在一些有用的so文件。

    最终,通过将/system/lib里面的so文件放到上述的文件夹中解决。

    后续

    在/system/lib文件夹中,我发现了一个 libmeddia_jni.huawei.so文件,可能华为对系统 进行定制的时候,进行了对应的优化,所以这边便出现了这样的问题。

    总算还是解决的,记录一下。虽然是旧手机旧系统没有多大的意义,好歹也是工作的一部分。

  • 相关阅读:
    软件测试自学,这就技术你get了吗?
    【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4
    【译】介绍 MSTest Runner – CLI、Visual Studio 等
    阿里 P9 架构师力荐:Java 面试必刷的 17 套一线大厂真题(含答案)
    sqlserver6
    05.重复匹配 (Python)
    什么是性格不良?如何自我分析性格不良?
    配置编译设置
    电容笔和Apple pencil区别有什么?双十一值得入手的电容笔推荐
    java实现对指定的敏感词汇进行过滤
  • 原文地址:https://blog.csdn.net/u013379032/article/details/125608917