|
|
本帖最后由 HaiMing 于 2026-6-18 00:43 编辑
Scene 不支持32位?自己编译一个补上就行了
前言
买了台电视盒子,芯片是64位的,系统却是32位。其实很多电视盒子和应用对32位兼容性更好,原厂这么配也能理解。本来想装个Scene看看硬件参数,结果安装的时候直接提示应用不兼容。拿MT管理器打开安装包一看,lib目录里就一个 arm64-v8a 的文件夹,armeabi-v7a 根本没有。也就是说这个应用只带64位库,32位系统装了就找不到so文件
本来想找个旧版本凑合用,后来琢磨了一下,不如先看看这个库到底干了什么。把那个 libnative-lib.so 拿出来翻了下符号表,才 5KB,就一个导出函数:Java_com_omarea_vtools_SceneJNI_getKernelPropLong。顺着符号往下看,逻辑很简单:收一个文件路径,用GB2312编码转成C字符串,fopen打开,fscanf读一个long整数,返回。就这点事。Scene 也就这一个 so,没有其他原生库了
这个逻辑太直了,自己照着写一个完全一样的,编译成32位塞回去就行。下面把步骤记一下
准备工作
需要三样东西:NDK编译环境、apktool拆包打包、一个签名用的keystore
NDK有点大,文件1/2GB是正常的
NDK推荐 r21e。Windows 64位 下载 android-ndk-r21e-windows-x86_64.zip,解压到 C:\ndk,里面有 ndk-build.cmd 就对了。Linux x86_64 同理下对应的 android-ndk-r21e-linux-x86_64.zip。如果 Linux 是 ARM64 架构的(比如树莓派、M1 虚拟机),r21 没有对应的包,用 r23c 的 android-ndk-r23c-linux.zip,解压到 ~/ndk 就行。apktool 官网可以下:https://ibotpeaches.github.io/Apktool/,keystore 没有的话后面会用命令生成
代码部分
新建一个 mylib 文件夹,里面再建 jni 文件夹,结构:
- mylib/
- └── jni/
- ├── Android.mk
- └── native-lib.cpp
复制代码
代码无法直接放在这里,否则代码会混入不间断空格(NBSP U+00A0)所以使用base64加密
Android.mk 内容:
- TE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQppbmNsdWRlICQoQ0xFQVJfVkFSUykKTE9DQUxfTU9EVUxFICAgIDo9IG5hdGl2ZS1saWIKTE9DQUxfU1JDX0ZJTEVTIDo9IG5hdGl2ZS1saWIuY3BwCkxPQ0FMX0xETElCUyAgICA6PSAtbGxvZwppbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkp
复制代码
native-lib.cpp(完全还原了原库的GB2312转码和文件读取逻辑):
- I2luY2x1ZGUgPGpuaS5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKc3RhdGljIGNoYXIqIGpzdHJpbmdUb0NoYXIoSk5JRW52KiBlbnYsIGpzdHJpbmcganN0cikgewogICAgaWYgKGpzdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CgogICAgamNsYXNzIHN0cmluZ0NsYXNzID0gZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9TdHJpbmciKTsKICAgIGlmIChzdHJpbmdDbGFzcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKCiAgICBqbWV0aG9kSUQgZ2V0Qnl0ZXNNZXRob2QgPSBlbnYtPkdldE1ldGhvZElEKHN0cmluZ0NsYXNzLCAiZ2V0Qnl0ZXMiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylbQiIpOwogICAgaWYgKGdldEJ5dGVzTWV0aG9kID09IE5VTEwpIHJldHVybiBOVUxMOwoKICAgIGpzdHJpbmcgY2hhcnNldE5hbWUgPSBlbnYtPk5ld1N0cmluZ1VURigiR0IyMzEyIik7CiAgICBpZiAoY2hhcnNldE5hbWUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CgogICAgamJ5dGVBcnJheSBieXRlQXJyYXkgPSAoamJ5dGVBcnJheSllbnYtPkNhbGxPYmplY3RNZXRob2QoanN0ciwgZ2V0Qnl0ZXNNZXRob2QsIGNoYXJzZXROYW1lKTsKICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoY2hhcnNldE5hbWUpOwogICAgaWYgKGJ5dGVBcnJheSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKCiAgICBqc2l6ZSBsZW4gPSBlbnYtPkdldEFycmF5TGVuZ3RoKGJ5dGVBcnJheSk7CiAgICBpZiAobGVuIDw9IDApIHsKICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGJ5dGVBcnJheSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgY2hhciogY3N0ciA9IChjaGFyKiltYWxsb2MobGVuICsgMSk7CiAgICBpZiAoY3N0ciA9PSBOVUxMKSB7CiAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihieXRlQXJyYXkpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGVudi0+R2V0Qnl0ZUFycmF5UmVnaW9uKGJ5dGVBcnJheSwgMCwgbGVuLCAoamJ5dGUqKWNzdHIpOwogICAgY3N0cltsZW5dID0gJ1wwJzsKCiAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGJ5dGVBcnJheSk7CiAgICByZXR1cm4gY3N0cjsKfQoKZXh0ZXJuICJDIiBKTklFWFBPUlQgamxvbmcgSk5JQ0FMTApKYXZhX2NvbV9vbWFyZWFfdnRvb2xzX1NjZW5lSk5JX2dldEtlcm5lbFByb3BMb25nKEpOSUVudiogZW52LCBqY2xhc3MgLyogY2xhenogKi8sIGpzdHJpbmcgcGF0aCkgewogICAgY2hhciogcGF0aFN0ciA9IGpzdHJpbmdUb0NoYXIoZW52LCBwYXRoKTsKICAgIGlmIChwYXRoU3RyID09IE5VTEwpIHJldHVybiAwOwoKICAgIGxvbmcgdmFsdWUgPSAwOwogICAgRklMRSogZnAgPSBmb3BlbihwYXRoU3RyLCAiciIpOwogICAgaWYgKGZwKSB7CiAgICAgICAgZnNjYW5mKGZwLCAiJWxkIiwgJnZhbHVlKTsKICAgICAgICBmY2xvc2UoZnApOwogICAgfQoKICAgIGZyZWUocGF0aFN0cik7CiAgICByZXR1cm4gdmFsdWU7Cn0=
复制代码
编译(注意上一步的两个文件放在 jni 文件夹里才对!)
Windows 打开 cmd:
- cd /d C:\Users\你的用户名\Desktop\mylib
- C:\ndk\ndk-build.cmd APP_ABI=armeabi-v7a
复制代码
Linux:
- cd ~/mylib
- ~/ndk/ndk-build APP_ABI=armeabi-v7a
复制代码
最后看到 [armeabi-v7a] Install : libnative-lib.so => lib/armeabi-v7a/libnative-lib.so 就是成功了,库就在 当前目录
塞回 APK
先用 apktool 解包:
- apktool d scene.apk -o scene_debug
复制代码
在 scene_debug/lib 里新建 armeabi-v7a 文件夹,把编译好的 libnative-lib.so 放进去。然后 务必删掉原来的 arm64-v8a 整个文件夹,不然系统可能会优先加载64位。重新打包:
- apktool b scene_debug -o scene_fixed.apk
复制代码
签名
没有 keystore 的话先生成一个,别名和密码都设成 debug 好记:
- keytool -genkey -v -keystore debug.keystore -alias debug -keyalg RSA -keysize 2048 -validity 10000 -storepass debug123 -keypass debug123
复制代码
然后签:
- jarsigner -verbose -keystore debug.keystore -storepass debug123 scene_fixed.apk debug
复制代码
输完密码完事。scene_fixed.apk 传到盒子上安装就能用了
整个过程能走通,主要还是因为 libnative-lib.so 本身 太简单 了,没有复杂逻辑,也没有其他依赖。作者估计觉得现在没几个32位设备了,编译的时候就懒得勾那个架构。自己补一个不费什么劲,也不用等更新。遇到类似情况的,只要原生库结构不复杂,都可以按这个思路试试 |
-
查看全部评分
总评分:金币 +1
|