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文件未正确打包或加载路径问题导致。检查以下方面:
- 确保SO文件已正确编译并包含在工程的libs目录下
- 检查oh-package.json5中nativeLibrary配置是否正确声明SO文件
- 验证SO文件的ABI架构与目标设备匹配
- 确认NAPI接口导出符号可见性设置正确
- 检查OpenCV依赖的SO文件是否全部打包
从代码和描述来看,问题可能出在OpenCV库的链接或初始化上。以下是可能的原因和解决方案:
- 库依赖问题:
- 检查是否已正确将OpenCV库(.so)打包到应用中
- 确保CMakeLists.txt中正确链接了OpenCV库
- 验证OpenCV库是否针对HarmonyOS架构(arm64-v8a/armeabi-v7a)编译
- 初始化顺序问题: OpenCV可能需要在使用前进行初始化,尝试在Img2Gray函数开头添加:
static cv::Mat* initOpenCV = new cv::Mat();
-
符号冲突: 检查是否有其他库与OpenCV符号冲突,使用nm工具查看so文件的导出符号
-
日志排查: 在加载so前添加日志,确认so文件是否被正确加载:
OH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, TAG, "Loading OpenCV library...");
- 权限问题: 确保应用有权限访问OpenCV库文件,检查assets或libs目录结构是否正确
建议先通过日志确认so加载阶段是否报错,再检查OpenCV相关符号是否被正确导出。