HarmonyOS鸿蒙Next中移植三方库libepoxy后应用闪退
HarmonyOS鸿蒙Next中移植三方库libepoxy后应用闪退
- IDE: DevEco Studio 5.1.0.849
- 设备: MatePad Pro 13.2(WEB-W00) 鸿蒙 5.1.0.150
想要将 libepoxy 这个库移植到鸿蒙上。libepoxy 没有原生鸿蒙支持,需要移植。 移植后应用闪退。
求大佬们指点!
过程
从 github 上下载 libepoxy 源码
修改源码
src\dispatch_common.c 中包含对操作系统的宏,修改:
#define EGL_LIB "libEGL.so"
#define GLES2_LIB "libGLESv2.so"
因为鸿蒙中不涉及其他的动态库,所以只需要修改这两个。
交叉编译
编辑 cross-file 文件:
[host_machine]
system = 'linux'
cpu_family = 'aarch64'
cpu = 'aarch64'
endian = 'little'
[properties]
prefix = 'C:\ws\libepoxy-1.5.10\install'
include_directories = ['C:\ws\libepoxy-1.5.10\install\include']
link_directories = ['C:\ws\libepoxy-1.5.10\install\lib']
sys_root = 'C:\Program Files/Huawei/DevEco Studio/sdk/default/openharmony\native\sysroot'
root = 'C:\Program Files/Huawei/DevEco Studio/sdk/default/openharmony\native\sysroot\usr\lib\aarch64-linux-ohos'
[built-in options]
c_args = [
'-IC:/ws/libepoxy-1.5.10/install/include',
'--sysroot=C:/Program Files/Huawei/DevEco Studio/sdk/default/openharmony/native/sysroot',
'-isystem', 'C:/Program Files/Huawei/DevEco Studio/sdk/default/openharmony/native/sysroot/usr/include',
'-isystem', 'C:/Program Files/Huawei/DevEco Studio/sdk/default/openharmony/native/sysroot/usr/include/aarch64-linux-ohos',
'-U_WIN32',
'-nostdinc',
'--target=aarch64-linux-ohos',
'-D__linux__', '-D__aarch64__', '-D__OHOS__']
c_link_args = [
'-L/C:/ws/libepoxy-1.5.10/install/lib',
'--sysroot=C:/Program Files/Huawei/DevEco Studio/sdk/default/openharmony/native/sysroot',
'-fuse-ld=lld',
'--target=aarch64-linux-ohos']
[binaries]
c = 'C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\llvm\bin\clang.exe'
cpp = 'C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\llvm\bin\clang++.exe'
ar = 'C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\llvm\bin\llvm-ar.exe'
ld = 'C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\llvm\bin\ld.lld.exe'
objcopy = 'C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\llvm\bin\llvm-objcopy.exe'
strip = 'C:\Program Files\Huawei\DevEco Studio\sdk\default\openharmony\native\llvm\bin\llvm-strip.exe'
pkg-config = 'pkg-config'
保存为 cross/ohos_arm64.txt 文件。
之后进行编译:
meson setup build/ohos_arm64 --cross-file cross/ohos_arm64.txt --prefix=C:\ws\libepoxy-1.5.10\install -Dx11=false -Dtests=false -Dglx=no
ninja -C build/ohos_arm64
ninja -C build/ohos_arm64 install
编译后在 libepoxy-1.5.10/install/lib 下得到 libepoxy.so.0.0.0 文件。
XComponent 工程
在 CodeLab 上下载官方的 XComponent 示例工程 (基于XComponent组件实现图像绘制功能)。
修改 module.json5 文件,在 “deviceTypes” 里加上 “tablet” 以适配我的平板电脑。除此之外无任何其他修改,可以在设备上正常运行。
接下来开始添加 libepoxy。
首先将 entry/build-profile.json5 中的 abiFilters 中的 x86_64 去掉,因为我只编译了 arm64 版本的动态链接库。
创建 entry/libs/arm64-v8a 文件夹,将 libepoxy-1.5.10/install/lib/libepoxy.so.0.0.0 拷贝过去,并复制两份: libepoxy.so libepoxy.so.0
创建 entry/src/main/cpp/thirdparty/epoxy 文件夹,将 libepoxy-1.5.10/install/include/epoxy 下的所有头文件拷贝进去。
之后编辑 src/main/cpp/CMakeLists.txt 文件,在最后添加:
target_link_libraries(nativerender PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}/libepoxy.so)
target_include_directories(nativerender PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/)
此时编译运行,程序是可以正常运行的。
观察 XComponent 工程,可以发现只有下面三个文件包含了 egl/.h 、 gles/.h 头文件:
- src/main/cpp/common/common.h
- src/main/cpp/render/egl_core.cpp
- src/main/cpp/render/egl_core.h
将所有对应的头文件注释掉,替换为 epoxy/egl.h。
编译运行。此时应用程序闪退。
下面是 fatal log:
Reason:Signal:SIGSEGV(SEGV_MAPERR)[@000000000000000000](/user/000000000000000000) probably caused by NULL pointer dereference
Fault thread info:
Tid:56992, Name:awei.xcomponent
#00 pc 0000000000000000 Not mapped
#01 pc 0000000000030ef8 /data/storage/el1/bundle/libs/arm64/libnativerender.so(EGLCore::LoadShader(unsigned int, char const*)+144)(27b4c4d0e9e7bb6dee715eaccf1dad16e4e95f03)
#02 pc 00000000000303a8 /data/storage/el1/bundle/libs/arm64/libnativerender.so(EGLCore::CreateProgram(char const*, char const*)+160)(27b4c4d0e9e7bb6dee715eaccf1dad16e4e95f03)
#03 pc 0000000000030288 /data/storage/el1/bundle/libs/arm64/libnativerender.so(EGLCore::CreateEnvironment()+392)(27b4c4d0e9e7bb6dee715eaccf1dad16e4e95f03)
#04 pc 00000000000300ac /data/storage/el1/bundle/libs/arm64/libnativerender.so(EGLCore::EglContextInit(void*, int, int)+704)(27b4c4d0e9e7bb6dee715eaccf1dad16e4e95f03)
#05 pc 00000000000314ec /data/storage/el1/bundle/libs/arm64/libnativerender.so(OnSurfaceCreatedCB(OH_NativeXComponent*, void*)+412)(27b4c4d0e9e7bb6dee715eaccf1dad16e4e95f03)
#06 pc 0000000001c17050 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::XComponentPattern::OnSurfaceCreated()+592)(4b8debfe88ba797872f8d1c1fae24a38)
#07 pc 00000000024358dc /system/lib64/platformsdk/libace_compatible.z.so(4b8debfe88ba797872f8d1c1fae24a38)
#08 pc 0000000000780e44 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::TaskExecutor::PostSyncTask(std::__h::function<void ()>&&, OHOS::Ace::TaskExecutor::TaskType, std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, OHOS::Ace::PriorityType) const+120)(4b8debfe88ba797872f8d1c1fae24a38)
#09 pc 00000000007999e0 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::TaskExecutor::PostSyncTask(std::__h::function<void ()> const&, OHOS::Ace::TaskExecutor::TaskType, std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&) const+84)(4b8debfe88ba797872f8d1c1fae24a38)
#10 pc 000000000242cc50 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::Framework::JsiDeclarativeEngine::FireExternalEvent(std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, unsigned int, bool)+3720)(4b8debfe88ba797872f8d1c1fae24a38)
#11 pc 0000000001c10c8c /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::XComponentPattern::FireExternalEvent(OHOS::Ace::RefPtr<OHOS::Ace::NG::PipelineContext>, std::__h::basic_string<char, std::__h::char_traits<char>, std::__h::allocator<char>> const&, unsigned int, bool)+192)(4b8debfe88ba797872f8d1c1fae24a38)
#12 pc 0000000001c1b118 /system/lib64/platformsdk/libace_compatible.z.so(4b8debfe88ba797872f8d1c1fae24a38)
#13 pc 0000000001c03518 /system/lib64/platformsdk/libace_compatible.z.so(4b8debfe88ba797872f8d1c1fae24a38)
#14 pc 0000000001c14728 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::XComponentPattern::XComponentSizeInit()+644)(4b8debfe88ba797872f8d1c1fae24a38)
#15 pc 0000000001c140a8 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::XComponentPattern::BeforeSyncGeometryProperties(OHOS::Ace::NG::DirtySwapConfig const&)+1060)(4b8debfe88ba797872f8d1c1fae24a38)
#16 pc 0000000001153298 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::FrameNode::SyncGeometryNode(bool, OHOS::Ace::NG::DirtySwapConfig const&)+1256)(4b8debfe88ba797872f8d1c1fae24a38)
#17 pc 000000000115d270 /system/lib64/platformsdk/libace_compatible.z.so(std::__h::__function::__func<OHOS::Ace::NG::FrameNode::Layout()::$_9, std::__h::allocator<OHOS::Ace::NG::FrameNode::Layout()::$_9>, void ()>::operator()() (.2b8827b0a607f9e9fdadaedebb7f2305)+80)(4b8debfe88ba797872f8d1c1fae24a38)
#18 pc 0000000000b0d270 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::UITaskScheduler::FlushSyncGeometryNodeTasks()+148)(4b8debfe88ba797872f8d1c1fae24a38)
#19 pc 0000000000b0d47c /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::UITaskScheduler::FlushLayoutTask(bool)+436)(4b8debfe88ba797872f8d1c1fae24a38)
#20 pc 0000000000b0dc78 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::UITaskScheduler::FlushTask()+104)(4b8debfe88ba797872f8d1c1fae24a38)
#21 pc 0000000000ae8e8c /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::PipelineContext::FlushVsync(unsigned long, unsigned int)+376)(4b8debfe88ba797872f8d1c1fae24a38)
#22 pc 0000000000a9dbd4 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::PipelineBase::OnVsyncEvent(unsigned long, unsigned int)+296)(4b8debfe88ba797872f8d1c1fae24a38)
#23 pc 0000000000aa01a0 /system/lib64/platformsdk/libace_compatible.z.so(4b8debfe88ba797872f8d1c1fae24a38)
#24 pc 00000000009c64f4 /system/lib64/platformsdk/libace_compatible.z.so(std::__h::function<void (unsigned long, unsigned int)>::operator()(unsigned long, unsigned int) const+64)(4b8debfe88ba797872f8d1c1fae24a38)
#25 pc 00000000009c6494 /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::Window::OnVsync(unsigned long, unsigned int)+64)(4b8debfe88ba797872f8d1c1fae24a38)
#26 pc 0000000000bd579c /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::RosenWindow::OnVsync(unsigned long, unsigned int)+36)(4b8debfe88ba797872f8d1c1fae24a38)
#27 pc 0000000000bd5d1c /system/lib64/platformsdk/libace_compatible.z.so(OHOS::Ace::NG::RosenWindow::RosenWindow(OHOS::sptr<OHOS::Rosen::Window> const&, OHOS::Ace::RefPtr<OHOS::Ace::TaskExecutor>, int)::$_0::operator()(long, long) const::'lambda'()::operator()() const+192)(4b8debfe88ba797872f8d1c1fae24a38)
#28 pc 0000000000bd5b60 /system/lib64/platformsdk/libace_compatible.z.so(4b8debfe88ba797872f8d1c1fae24a38)
#29 pc 00000000000fc7c8 /system/lib64/libwm.z.so(OHOS::Rosen::VsyncStation::VsyncCallbackInner(long, long)+712)(309b1e7326e927201f8def145cb918e4)
#30 pc 00000000000fc464 /system/lib64/libwm.z.so(309b1e7326e927201f8def145cb918e4)
#31 pc 00000000000271c8 /system/lib64/libvsync.z.so(OHOS::Rosen::VSyncCallBackListener::HandleVsyncCallbacks(long*, long, int)+688)(e5373f60da2df16016d7240120dc8ae9)
#32 pc 0000000000026d1c /system/lib64/libvsync.z.so(OHOS::Rosen::VSyncCallBackListener::OnReadable(int)+208)(e5373f60da2df16016d7240120dc8ae9)
#33 pc 0000000000020430 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(c0a7635591a1d4aa5d3ccc3832c4d343)
#34 pc 000000000001bdb4 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::EventHandler::DistributeEvent(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)> const&)+1140)(c0a7635591a1d4aa5d3ccc3832c4d343)
#35 pc 000000000002d690 /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS::AppExecFwk::(anonymous namespace)::EventRunnerImpl::ExecuteEventHandler(std::__h::unique_ptr<OHOS::AppExecFwk::InnerEvent, void (*)(OHOS::AppExecFwk::InnerEvent*)>&)+348)(c0a7635591a1d4aa5d3ccc3832c4d343)
#36 pc 000000000002cf4c /system/lib64/chipset-pub-sdk/libeventhandler.z.so(OHOS
更多关于HarmonyOS鸿蒙Next中移植三方库libepoxy后应用闪退的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中移植libepoxy后出现闪退,通常是由于依赖的OpenGL ES接口不兼容或未正确适配鸿蒙图形子系统导致。需检查libepoxy的EGL/GLES调用是否与鸿蒙的图形架构匹配,重点排查上下文初始化、函数指针加载及扩展支持。建议验证libepoxy的配置宏(如EPOXY_GLES
)是否正确定义,并确保NDK版本与鸿蒙Next的API级别一致。可通过日志捕获GPU错误或异常信号定位具体崩溃点。
更多关于HarmonyOS鸿蒙Next中移植三方库libepoxy后应用闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
从崩溃日志看,问题出现在libepoxy未能正确加载OpenGL函数指针。虽然您修改了libepoxy的库名,但鸿蒙Next的EGL/GLES实现可能与标准Linux存在差异,导致函数解析失败。
建议检查以下几点:
- 确认libepoxy的初始化是否正确执行,特别是
epoxy_gl_init()
是否在调用任何GL函数前被调用 - 验证鸿蒙的EGL上下文创建流程,确保在调用
glCreateShader
前已有有效的GL上下文 - 检查libepoxy的dispatch机制是否适配鸿蒙的GL/EGL库特性
可以尝试在调用任何GL函数前添加上下文检查,或直接使用鸿蒙原生GL头文件进行对比测试,以确定是否是libepoxy的函数加载机制存在问题。