Android集成外部非Android Java库运行提示找不到.so文件问题求助
问题本质说明
你用到的jpgf.jar并非纯Java实现的库,它的核心逻辑是C/C++编写的,Java层只是JNI调用的封装,所以运行时必须依赖对应目标平台的原生.so库才能正常工作。你之前在桌面64位机器上编译出的.so是桌面Linux架构的,和Android平台的ARM/安卓x86架构完全不兼容,不是单纯32位/64位的差异。
问题1解答:如何编译适配Android的.so文件
不要用本地的gcc工具做交叉编译,不管加什么32位参数,本地gcc编译出来的文件都只能运行在桌面Linux系统上,无法在Android设备运行。正确操作步骤如下:
- 安装Android NDK,建议选择r21e及以上的长期支持版本,兼容性更好
- 找到
jpgf库对应的原生C/C++源码,编写NDK编译脚本:Application.mk中指定你需要适配的ABI,比如配置APP_ABI := armeabi-v7a arm64-v8a x86 x86_64即可覆盖目前所有主流Android设备的架构- 编写对应的
Android.mk或者CMakeLists.txt指定源码编译规则
- 用NDK提供的
ndk-build命令或者CMake工具执行编译,就能生成对应每个ABI架构的libjpgf.so文件,将这些文件分别放到项目jniLibs目录下对应的架构子文件夹中即可。
问题2解答:能不能不用预编译的.so文件
你必须依赖对应Android平台的.so文件才能运行这个库,没有办法只靠JAR包正常启动。你看到其他人只导入JAR包就能用,要么是对方用到的JAR包已经内置了所有需要的架构的.so文件,要么是对方用的是第三方封装的纯Java版本(官方版本不存在纯Java实现)。
如果你不想手动处理交叉编译,可以直接把jpgf的Java源码和原生C/C++源码都导入你的Android项目中,在app模块的build.gradle里配置好NDK编译路径,Android Studio会在编译应用的时候自动生成对应目标设备架构的.so文件,不需要你手动处理编译、放文件的步骤,后续升级库版本也更方便。
内容的提问来源于stack exchange,提问作者harisont
相关产品推荐
相关产品推荐

