HarmonyOS 鸿蒙Next 我创建要给c++工程,为什么引用so后,RegisterEntryModule(void)没有被调用
HarmonyOS 鸿蒙Next 我创建要给c++工程,为什么引用so后,RegisterEntryModule(void)没有被调用
头文件
// bubblesort.h
#ifndef BUBBLESORT_H
#define BUBBLESORT_H
#include <vector>
#define OHOS_EXPORTED_SYMBOL __attribute__((visibility("default")))
OHOS_EXPORTED_SYMBOL void bubbleSort(std::vector<int>& arr);
#endif // BUBBLESORT_H
cpp文件
#include "bubblesort.h"
//#include <vector>
void bubbleSort(std::vector<int>& arr) {
bool swapped;
do {
swapped = false;
for (size_t i = 1; i < arr.size(); ++i) {
if (arr[i - 1] > arr[i]) {
std::swap(arr[i - 1], arr[i]);
swapped = true;
}
}
} while (swapped);
}
编译命令
OpenHarmony\Sdk\12\native\llvm\bin/clang++.exe --target=aarch64-linux-ohos -fvisibility=hidden --sysroot="OpenHarmonySDK/builds/12/native/sysroot" -fPIC -shared -o libbubblesort.so -g bubblesort.cpp
编译出来的so,我在鸿蒙工程中引用。 target_link_libraries(entry PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/testLib/${OHOS_ARCH}/libbubblesort.so)
但是只要引用了这个自己编译出来的so,RegisterEntryModule(void)就不会因为extern "C" attribute((constructor)) 的修改而自己调用了。这是为什么?求助各位大佬!!!!!!!!!!!
所有__attribute__((constructor))修饰的函数都不自动调用了。
更多关于HarmonyOS 鸿蒙Next 我创建要给c++工程,为什么引用so后,RegisterEntryModule(void)没有被调用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next 我创建要给c++工程,为什么引用so后,RegisterEntryModule(void)没有被调用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,如果你创建了一个C++工程并引用了.so
动态库文件,但发现RegisterEntryModule(void)
函数没有被调用,这通常是因为以下原因:
-
函数导出问题:确保
RegisterEntryModule
函数在.so
库中已正确导出。在C++中,函数名称可能会因为名称修饰(name mangling)而变得与原始声明不同。使用extern "C"
声明可以避免这种情况。例如:extern "C" void RegisterEntryModule() { // 函数实现 }
-
加载顺序:检查
.so
库是否在你期望的时间点被加载。如果库是在RegisterEntryModule
预期被调用的时间点之后才被加载,那么它自然不会被调用。 -
符号解析:确保没有其他符号冲突或解析问题导致
RegisterEntryModule
被覆盖或忽略。 -
系统配置:检查系统或框架的配置文件,确保没有设置阻止
RegisterEntryModule
被调用的规则。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html