如何解决HarmonyOS鸿蒙Next中自定义类与NAPI框架中原有的标识符命名冲突导致内存错乱的问题
如何解决HarmonyOS鸿蒙Next中自定义类与NAPI框架中原有的标识符命名冲突导致内存错乱的问题
【问题现象】
C++库编译后出现内存错乱的现象:构建模块entry生成动态库,点击运行安装进手机生成日志后打印内容会变为乱码。
【背景知识】
C++语言中,当我们需要定义一个变量或者函数时,若其名字与库里面的名字相互冲突则会产生各种问题。
【定位思路】
构建、运行、触发打印、查看日志后复现打印乱码的现象,发现是使用NativeEngine类名才会出现乱码,修改NativeEngine类名之后乱码消失,猜测是类名冲突或者关键字命名冲突。
排查代码发现导致出现问题的类名:NativeEngine与在NAPI框架中已存在的原有的标识符之间存在命名冲突。
【解决方案】
建议一:使用namespace(优选)
C++提供了一个命名空间(namespace)用于解决命名冲突问题,也可用于结构化层次化管理名称。
要使用命名空间需要先通过namespace关键字声明一个新的命名空间。
// native_engine.h
namespace NE{ // 声明一个新的命名空间
class NativeEngine{ // 命名冲突的类
...
};
} // namespace新增
使用命名空间中的成员时,有三种不同的方式:
1. 全部展开
通过using namespace 命名空间名称将对应命名空间中的名称全部导出,这种方式相当于告诉编译器,后续的代码将使用指定命名空间中的名称。但这样做也增大了命名冲突的风险,此处是在伙伴自定义的库文件中使用,因此可以确认无风险。
// native_engine.cc
using namespace NE; // 使用using关键字将namespace中的成员全部导出
NativeEngine::NativeEngine(...)
2. 使用时单独指定
通过作用域解析符(::)在出现冲突的地方指定使用namespace中的类。
//multiple_engine.cc
...
p = std::make_unique<NE::NativeEngine>(cfg); // 通过::指定使用namespace中的NativeEngine
...
3. 单独展开
使用using关键字结合作用域解析符单独展开命名空间中的某一个成员,此后本文件中使用该名称对应的成员时均会使用该命名空间中的成员。
using NE:NativeEngine
建议二:增加-Bsymbolic编译选项
在CMakeLists里添加set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")
。
此编译选项的作用是优先使用本地动态库的符号,而不是使用全局符号。
-Bsymbolic会解决很多符号抢占带来的问题,但是在某些场景可能会出现一些问题,比如因为会强制使变量也使用本地的符号,所以可能会导致单例模式失效。
【总结】
出现编译出现乱码的情况后,可以往命名冲突的方向排查,发现冲突的命名后可以用namespace的方式将冲突命名隔离。
更多关于如何解决HarmonyOS鸿蒙Next中自定义类与NAPI框架中原有的标识符命名冲突导致内存错乱的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于如何解决HarmonyOS鸿蒙Next中自定义类与NAPI框架中原有的标识符命名冲突导致内存错乱的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,自定义类与NAPI框架中原有的标识符命名冲突可能导致内存错乱
解决此问题的方法包括:
-
命名空间隔离:通过使用命名空间来隔离自定义类和NAPI框架中的标识符,避免命名冲突。例如,将自定义类放置在特定的命名空间中,确保其标识符与NAPI框架中的标识符不重复。
-
前缀或后缀:在自定义类的标识符前或后添加唯一的前缀或后缀,以区分其与NAPI框架中的标识符。例如,可以在自定义类名或方法名前加上特定的前缀,如“MyClass_”或“Custom_”。
-
重构代码:检查并重构代码,确保自定义类的标识符与NAPI框架中的标识符不重复。可以通过重命名自定义类或方法,避免与NAPI框架中的标识符冲突。
-
使用宏定义:在代码中使用宏定义来替换自定义类的标识符,确保其与NAPI框架中的标识符不冲突。例如,可以使用宏定义将自定义类名替换为唯一的名称。
-
静态分析工具:使用静态分析工具检测代码中的命名冲突问题,并自动修复或提示可能的冲突点。这有助于在开发阶段及时发现并解决命名冲突问题。
通过以上方法,可以有效解决HarmonyOS鸿蒙Next中自定义类与NAPI框架中原有的标识符命名冲突导致的内存错乱问题。