HarmonyOS 鸿蒙Next 我创建要给c++工程,为什么引用so后,RegisterEntryModule(void)没有被调用

发布于 1周前 作者 h691938207 最后一次编辑是 5天前 来自 鸿蒙OS

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

1 回复

更多关于HarmonyOS 鸿蒙Next 我创建要给c++工程,为什么引用so后,RegisterEntryModule(void)没有被调用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,如果你创建了一个C++工程并引用了.so动态库文件,但发现RegisterEntryModule(void)函数没有被调用,这通常是因为以下原因:

  1. 函数导出问题:确保RegisterEntryModule函数在.so库中已正确导出。在C++中,函数名称可能会因为名称修饰(name mangling)而变得与原始声明不同。使用extern "C"声明可以避免这种情况。例如:

    extern "C" void RegisterEntryModule() {
        // 函数实现
    }
    
  2. 加载顺序:检查.so库是否在你期望的时间点被加载。如果库是在RegisterEntryModule预期被调用的时间点之后才被加载,那么它自然不会被调用。

  3. 符号解析:确保没有其他符号冲突或解析问题导致RegisterEntryModule被覆盖或忽略。

  4. 系统配置:检查系统或框架的配置文件,确保没有设置阻止RegisterEntryModule被调用的规则。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部