HarmonyOS 鸿蒙Next中使用Napi opencv生成SO加载时SO显示undefined

HarmonyOS 鸿蒙Next中使用Napi opencv生成SO加载时SO显示undefined

这样注释掉opencv 相关的是正常的 放开就so无法加载    构建时也没有任何报错  怎么定位和解决问题?

#include "napi/native_api.h"
//
//#include "opencv/Operation_image.h"
//
//
//static const char *TAG = "[opencv_img2Gray]";
//using namespace std;
//using namespace cv;
//
//static napi_value Img2Gray(napi_env env, napi_callback_info info) {
//    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "Img2Gray Begin");
//    napi_value result = NapiGetNull(env);
//    size_t argc = 3;
//    napi_value argv[3] = {nullptr};
//
//    napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
//
//    size_t strSize;
//    char strBuf[256];
//    napi_get_value_string_utf8(env, argv[1], strBuf, sizeof(strBuf), &strSize);
//    std::string fileDir(strBuf, strSize);
//    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "fileDir:%{public}s", fileDir.c_str());
//
//    napi_get_value_string_utf8(env, argv[2], strBuf, sizeof(strBuf), &strSize);
//    std::string fileName(strBuf, strSize);
//    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "fileName:%{public}s", fileName.c_str());
//
//    Mat srcImage;
//    if (!GetMatFromRawFile(env, argv[0], fileDir, fileName, srcImage)) {
//        OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "Get Mat from rawfile failed!.");
//        return result;
//    }
//
//    Mat srcGray;
//    cvtColor(srcImage, srcGray, COLOR_RGB2GRAY);
//
//    // 將图像转换为pixelMap格式
//    Mat outMat;
//    cvtMat2Pixel(srcGray, outMat, RGBA_8888);
//    OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "outMat size: %zu, cols:%{public}d, rows:%{public}d",
//                 outMat.total(), outMat.cols, outMat.rows);
//
//    napi_create_object(env, &result);
//    bool retVal = WrapJsPixelInfoInfo(env, outMat, result);
//    if (!retVal) {
//        OH_LOG_Print(LOG_APP, LOG_ERROR, GLOBAL_RESMGR, TAG, "WrapJsInfo failed!.");
//    }
//
//    return result;
//}


static napi_value Add(napi_env env, napi_callback_info info)
{
    size_t argc = 2;
    napi_value args[2] = {nullptr};

    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

    napi_valuetype valuetype0;
    napi_typeof(env, args[0], &valuetype0);

    napi_valuetype valuetype1;
    napi_typeof(env, args[1], &valuetype1);

    double value0;
    napi_get_value_double(env, args[0], &value0);

    double value1;
    napi_get_value_double(env, args[1], &value1);

    napi_value sum;
    napi_create_double(env, value0 + value1, &sum);

    return sum;

}

static napi_value Min(napi_env env, napi_callback_info info)
{
    size_t argc = 2;
    napi_value args[2] = {nullptr};

    napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);

    napi_valuetype valuetype0;
    napi_typeof(env, args[0], &valuetype0);

    napi_valuetype valuetype1;
    napi_typeof(env, args[1], &valuetype1);

    double value0;
    napi_get_value_double(env, args[0], &value0);

    double value1;
    napi_get_value_double(env, args[1], &value1);

    napi_value sum;
    napi_create_double(env, value0 - value1, &sum);

    return sum;

}

更多关于HarmonyOS 鸿蒙Next中使用Napi opencv生成SO加载时SO显示undefined的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

感谢您的提问,为了更快解决您的问题,麻烦请补充以下信息:

问题现象(如:报错日志、异常截图、问题背景);

复现代码(如最小复现demo,请尽量提供,便于复现问题);

版本信息(如:开发工具、手机系统版本信息);

更多关于HarmonyOS 鸿蒙Next中使用Napi opencv生成SO加载时SO显示undefined的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


搜你的动态库名称在hilog里面,大概率是有报错的。

在HarmonyOS Next中使用NAPI加载OpenCV生成的SO文件出现"undefined"错误,通常是由于SO文件未正确打包或加载路径问题导致。检查以下方面:

  1. 确保SO文件已正确编译并包含在工程的libs目录下
  2. 检查oh-package.json5中nativeLibrary配置是否正确声明SO文件
  3. 验证SO文件的ABI架构与目标设备匹配
  4. 确认NAPI接口导出符号可见性设置正确
  5. 检查OpenCV依赖的SO文件是否全部打包

从代码和描述来看,问题可能出在OpenCV库的链接或初始化上。以下是可能的原因和解决方案:

  1. 库依赖问题:
  • 检查是否已正确将OpenCV库(.so)打包到应用中
  • 确保CMakeLists.txt中正确链接了OpenCV库
  • 验证OpenCV库是否针对HarmonyOS架构(arm64-v8a/armeabi-v7a)编译
  1. 初始化顺序问题: OpenCV可能需要在使用前进行初始化,尝试在Img2Gray函数开头添加:
static cv::Mat* initOpenCV = new cv::Mat();
  1. 符号冲突: 检查是否有其他库与OpenCV符号冲突,使用nm工具查看so文件的导出符号

  2. 日志排查: 在加载so前添加日志,确认so文件是否被正确加载:

OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "Loading OpenCV library...");
  1. 权限问题: 确保应用有权限访问OpenCV库文件,检查assets或libs目录结构是否正确

建议先通过日志确认so加载阶段是否报错,再检查OpenCV相关符号是否被正确导出。

回到顶部