检查库的连接路径

This commit is contained in:
JackLee 2026-02-20 22:55:03 +08:00
parent 03fee8fe68
commit e95f08f648
7 changed files with 201 additions and 219 deletions

View File

@ -17,7 +17,7 @@
"arkOptions": { "arkOptions": {
"runtimeOnly" : { "runtimeOnly" : {
"packages": [ "packages": [
"libOCCTRender.so" "libocctrender.so"
] ]
} }
} }

View File

@ -6,13 +6,13 @@
"lockfileVersion": 3, "lockfileVersion": 3,
"ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.",
"specifiers": { "specifiers": {
"libOCCTRender.so@src/main/cpp/types/libOCCTRender": "libOCCTRender.so@src/main/cpp/types/libOCCTRender" "libocctrender.so@src/main/cpp/types/libocctrender": "libocctrender.so@src/main/cpp/types/libocctrender"
}, },
"packages": { "packages": {
"libOCCTRender.so@src/main/cpp/types/libOCCTRender": { "libocctrender.so@src/main/cpp/types/libocctrender": {
"name": "libOCCTRender.so", "name": "libocctrender.so",
"version": "1.0.0", "version": "1.0.0",
"resolved": "src/main/cpp/types/libOCCTRender", "resolved": "src/main/cpp/types/libocctrender",
"registryType": "local" "registryType": "local"
} }
} }

View File

@ -6,6 +6,6 @@
"author": "", "author": "",
"license": "", "license": "",
"dependencies": { "dependencies": {
"libOCCTRender.so": "file:./src/main/cpp/types/libOCCTRender" "libocctrender.so": "file:./src/main/cpp/types/libocctrender"
} }
} }

View File

@ -14,31 +14,8 @@ include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include) ${NATIVERENDER_ROOT_PATH}/include)
# OCCT # OCCT
set(OCCT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include/opencascade)
set(OCCT_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH}) set(OCCT_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${OHOS_ARCH})
# OCCT
link_directories(${OCCT_LIB_DIR}) link_directories(${OCCT_LIB_DIR})
include_directories(${OCCT_INCLUDE_DIR})
#
add_library(OCCTRender SHARED
napi_init.cpp
#Header
EGLCore/EGLCore.h
OCCTRender/OCCTRender.h
OCCTRenderThread/OCCTRenderThread.h
#Cpp Src
EGLCore/EGLCore.cpp
OCCTRender/OCCTRender.cpp
OCCTRenderThread/OCCTRenderThread.cpp
)
find_library(EGL-lib EGL)
find_library(GLES-lib GLESv3)
find_library(hilog-lib hilog_ndk.z)
find_library(libace-lib ace_ndk.z)
find_library(libuv-lib uv)
set(OCCT_LIBS set(OCCT_LIBS
${OCCT_LIB_DIR}/libTKernel.so.7.9 ${OCCT_LIB_DIR}/libTKernel.so.7.9
@ -77,8 +54,26 @@ set(OCCT_LIBS
${OCCT_LIB_DIR}/libbrotlidec.so.1 ${OCCT_LIB_DIR}/libbrotlidec.so.1
${OCCT_LIB_DIR}/libbrotlienc.so.1 ${OCCT_LIB_DIR}/libbrotlienc.so.1
) )
#
add_library(occtrender SHARED
napi_init.cpp
#Header
EGLCore/EGLCore.h
OCCTRender/OCCTRender.h
OCCTRenderThread/OCCTRenderThread.h
#Cpp Src
EGLCore/EGLCore.cpp
OCCTRender/OCCTRender.cpp
OCCTRenderThread/OCCTRenderThread.cpp
)
target_link_libraries(OCCTRender PUBLIC find_library(EGL-lib EGL)
find_library(GLES-lib GLESv3)
find_library(hilog-lib hilog_ndk.z)
find_library(libace-lib ace_ndk.z)
find_library(libuv-lib uv)
target_link_libraries(occtrender PUBLIC
# OCCT # OCCT
${OCCT_LIBS} ${OCCT_LIBS}
#EGL Hilog #EGL Hilog

View File

@ -0,0 +1,12 @@
按照下面要求生成实现代码:
1-HarmonyOS API 版本:22
2-OpenGL ES 版本:3.0
3-OCCT 版本:7.9.3
4-分别用类名字为EGLCore OCCTRenderThread OCCTRender实现
5-实现主线程和渲染线程分离.渲染线程循环渲染
6-实现通过loadmodel加载step文件进行渲染step模型
7-实现鼠标旋转相机观察渲染的模型.
8-Arkui通过XComponent的Native进行调用实现.
9-不得使用android的实现代码.使用鸿蒙原生API实现
10-在napi_init.cpp文件中写出给arkui调用的函数.包括回调函数
11-在Index.d.ts文件中写出暴露给arkui调用的代码

View File

@ -1,140 +1,115 @@
#include "napi/native_api.h" #include "napi/native_api.h"
//#include "OCCTRenderThread/OCCTRenderThread.h" #include "OCCTRenderThread/OCCTRenderThread.h"
#include <map> #include <map>
#include <string> #include <string>
//#define LOG_TAG "NAPI_INIT" #define LOG_TAG "NAPI_INIT"
//#define LOGI(...) (LOG_TAG, __VA_ARGS__) #define LOGI(...) (LOG_TAG, __VA_ARGS__)
//
////存储 XComponent ID 到 OCCTRenderThread 实例的映射
//static std::map<std::string, OCCTRenderThread*> g_renderThreads;
//
////NAPI: 初始化渲染器(绑定 XComponent
//static napi_value InitRenderer(napi_env env, napi_callback_info info) {
// size_t argc = 3;
// napi_value args[3];
// napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
//
// // 参数1: xcomponentId (string)
// char xcompId[256];
// size_t xcompIdLen;
// napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &xcompIdLen);
//
// // 参数2: nativeWindow (EGLNativeWindowType, 实际是 void*)
// EGLNativeWindowType window = nullptr;
// napi_get_value_external(env, args[1], reinterpret_cast<void**>(&window));
//
// // 参数3: { width, height }
// int32_t width = 0, height = 0;
// napi_valuetype type;
// napi_typeof(env, args[2], &type);
// if (type == napi_object) {
// napi_value w, h;
// napi_get_named_property(env, args[2], "width", &w);
// napi_get_named_property(env, args[2], "height", &h);
// napi_get_value_int32(env, w, &width);
// napi_get_value_int32(env, h, &height);
// }
//
// // 创建渲染线程
// LOGI('Init RenderThread');
// auto* renderThread = new OCCTRenderThread(window, width, height);
// renderThread->start();
// LOGI('Deno Init RenderThread');
// g_renderThreads[std::string(xcompId)] = renderThread;
//
// return nullptr;
//}
//
//// NAPI: 加载 STEP 模型
//static napi_value LoadModel(napi_env env, napi_callback_info info) {
// LOGI('Start LoadModel');
// size_t argc = 2;
// napi_value args[2];
// napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
//
// char xcompId[256];
// size_t len;
// napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &len);
//
// char modelPath[1024];
// size_t pathLen;
// napi_get_value_string_utf8(env, args[1], modelPath, sizeof(modelPath), &pathLen);
// LOGI('Find RenderThread');
// auto it = g_renderThreads.find(std::string(xcompId));
// if (it != g_renderThreads.end()) {
// LOGI('LoadModel Began');
// it->second->loadModel(modelPath);
// }
//
// return nullptr;
//}
//
//// NAPI: 鼠标/触摸事件(可选,用于旋转)
//static napi_value OnMouseEvent(napi_env env, napi_callback_info info) {
// size_t argc = 3;
// napi_value args[3];
// napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
//
// char xcompId[256];
// size_t len;
// napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &len);
//
// double dx, dy;
// napi_get_value_double(env, args[1], &dx);
// napi_get_value_double(env, args[2], &dy);
//
// auto it = g_renderThreads.find(std::string(xcompId));
// if (it != g_renderThreads.end()) {
// it->second->onMouseEvent(static_cast<float>(dx), static_cast<float>(dy));
// }
//
// return nullptr;
//}
//
//// NAPI: 销毁渲染器
//static napi_value DestroyRenderer(napi_env env, napi_callback_info info) {
// size_t argc = 1;
// napi_value args[1];
// napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
//
// char xcompId[256];
// size_t len;
// napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &len);
//
// auto it = g_renderThreads.find(std::string(xcompId));
// if (it != g_renderThreads.end()) {
// it->second->stop();
// delete it->second;
// g_renderThreads.erase(it);
// }
//
// return nullptr;
//}
static napi_value Add(napi_env env, napi_callback_info info) //存储 XComponent ID 到 OCCTRenderThread 实例的映射
{ static std::map<std::string, OCCTRenderThread*> g_renderThreads;
size_t argc = 2;
napi_value args[2] = {nullptr};
//NAPI: 初始化渲染器(绑定 XComponent
static napi_value InitRenderer(napi_env env, napi_callback_info info) {
size_t argc = 3;
napi_value args[3];
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
napi_valuetype valuetype0; // 参数1: xcomponentId (string)
napi_typeof(env, args[0], &valuetype0); char xcompId[256];
size_t xcompIdLen;
napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &xcompIdLen);
napi_valuetype valuetype1; // 参数2: nativeWindow (EGLNativeWindowType, 实际是 void*)
napi_typeof(env, args[1], &valuetype1); EGLNativeWindowType window = nullptr;
napi_get_value_external(env, args[1], reinterpret_cast<void**>(&window));
double value0; // 参数3: { width, height }
napi_get_value_double(env, args[0], &value0); int32_t width = 0, height = 0;
napi_valuetype type;
napi_typeof(env, args[2], &type);
if (type == napi_object) {
napi_value w, h;
napi_get_named_property(env, args[2], "width", &w);
napi_get_named_property(env, args[2], "height", &h);
napi_get_value_int32(env, w, &width);
napi_get_value_int32(env, h, &height);
}
double value1; // 创建渲染线程
napi_get_value_double(env, args[1], &value1); LOGI('Init RenderThread');
auto* renderThread = new OCCTRenderThread(window, width, height);
renderThread->start();
LOGI('Deno Init RenderThread');
g_renderThreads[std::string(xcompId)] = renderThread;
napi_value sum; return nullptr;
napi_create_double(env, value0 + value1, &sum); }
return sum; // NAPI: 加载 STEP 模型
static napi_value LoadModel(napi_env env, napi_callback_info info) {
LOGI('Start LoadModel');
size_t argc = 2;
napi_value args[2];
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
char xcompId[256];
size_t len;
napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &len);
char modelPath[1024];
size_t pathLen;
napi_get_value_string_utf8(env, args[1], modelPath, sizeof(modelPath), &pathLen);
LOGI('Find RenderThread');
auto it = g_renderThreads.find(std::string(xcompId));
if (it != g_renderThreads.end()) {
LOGI('LoadModel Began');
it->second->loadModel(modelPath);
}
return nullptr;
}
// NAPI: 鼠标/触摸事件(可选,用于旋转)
static napi_value OnMouseEvent(napi_env env, napi_callback_info info) {
size_t argc = 3;
napi_value args[3];
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
char xcompId[256];
size_t len;
napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &len);
double dx, dy;
napi_get_value_double(env, args[1], &dx);
napi_get_value_double(env, args[2], &dy);
auto it = g_renderThreads.find(std::string(xcompId));
if (it != g_renderThreads.end()) {
it->second->onMouseEvent(static_cast<float>(dx), static_cast<float>(dy));
}
return nullptr;
}
// NAPI: 销毁渲染器
static napi_value DestroyRenderer(napi_env env, napi_callback_info info) {
size_t argc = 1;
napi_value args[1];
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
char xcompId[256];
size_t len;
napi_get_value_string_utf8(env, args[0], xcompId, sizeof(xcompId), &len);
auto it = g_renderThreads.find(std::string(xcompId));
if (it != g_renderThreads.end()) {
it->second->stop();
delete it->second;
g_renderThreads.erase(it);
}
return nullptr;
} }
EXTERN_C_START EXTERN_C_START
@ -143,11 +118,10 @@ static napi_value Init(napi_env env, napi_value exports) {
return nullptr; return nullptr;
} }
napi_property_descriptor desc[] = { napi_property_descriptor desc[] = {
//{"initRenderer", nullptr, InitRenderer,nullptr, nullptr, nullptr, napi_default, nullptr}, {"initRenderer", nullptr, InitRenderer,nullptr, nullptr, nullptr, napi_default, nullptr},
//{"loadModel", nullptr, LoadModel,nullptr, nullptr, nullptr, napi_default, nullptr}, {"loadModel", nullptr, LoadModel,nullptr, nullptr, nullptr, napi_default, nullptr},
//{"onMouseEvent", nullptr, OnMouseEvent,nullptr, nullptr, nullptr, napi_default, nullptr}, {"onMouseEvent", nullptr, OnMouseEvent,nullptr, nullptr, nullptr, napi_default, nullptr},
//{"destroyRenderer", nullptr, DestroyRenderer,nullptr, nullptr, nullptr, napi_default, nullptr}, {"destroyRenderer", nullptr, DestroyRenderer,nullptr, nullptr, nullptr, napi_default, nullptr},
{ "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }
}; };
if (napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc) != napi_ok) { if (napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc) != napi_ok) {
@ -158,17 +132,17 @@ static napi_value Init(napi_env env, napi_value exports) {
EXTERN_C_END EXTERN_C_END
// 编写接口的描述信息,根据实际需要可以修改对应参数 // 编写接口的描述信息,根据实际需要可以修改对应参数
static napi_module OCCTModel = { static napi_module occtmodel = {
.nm_version = 1, .nm_version = 1,
.nm_flags = 0, .nm_flags = 0,
.nm_filename = nullptr, .nm_filename = nullptr,
.nm_register_func = Init, .nm_register_func = Init,
.nm_modname = "OCCTRender", .nm_modname = "occtrender",
.nm_priv = ((void*)0), .nm_priv = ((void*)0),
.reserved = { 0 } .reserved = { 0 }
}; };
extern "C" __attribute__((constructor)) void RegisterModule(void) extern "C" __attribute__((constructor)) void RegisterModule(void)
{ {
napi_module_register(&OCCTModel); napi_module_register(&occtmodel);
} }

View File

@ -2,7 +2,7 @@ import { hilog } from '@kit.PerformanceAnalysisKit';
import fs from '@ohos.file.fs'; import fs from '@ohos.file.fs';
import fileIO from '@ohos.fileio'; import fileIO from '@ohos.fileio';
import { Context } from '@kit.AbilityKit'; import { Context } from '@kit.AbilityKit';
//import OCCTRender from 'libOCCTRender.so'; import OCCTRender from 'libocctrender.so';
const DOMAIN = 0x0000; const DOMAIN = 0x0000;
@ -46,6 +46,7 @@ export struct ModelView {
} }
build() { build() {
Flex({ direction: FlexDirection.Column }) { Flex({ direction: FlexDirection.Column }) {
Row(){
Button('加载模型').onClick(()=>{ Button('加载模型').onClick(()=>{
try { try {
// 调用 native 初始化渲染器 // 调用 native 初始化渲染器
@ -56,53 +57,53 @@ export struct ModelView {
// 复制模型文件并获取路径 // 复制模型文件并获取路径
console.info('Model copied to:', this.modelPath); console.info('Model copied to:', this.modelPath);
// 调用 native 加载 // 调用 native 加载
//OCCTRender.loadModel(this.displayContrId, this.modelPath); OCCTRender.loadModel(this.displayContrId, this.modelPath);
} catch (e) { } catch (e) {
hilog.error(0x0000, 'ModelView', `LoadModel Failed: ${JSON.stringify(e)}`); hilog.error(0x0000, 'ModelView', `LoadModel Failed: ${JSON.stringify(e)}`);
} }
}) })
Button('日志测试').onClick(async()=>{ Button('日志测试').onClick(async()=>{
//NAPI日志接口测试 //NAPI日志接口测试
let OCCTRender = await import("libOCCTRender.so") let OCCTRender = await import("libocctrender.so")
hilog.info(DOMAIN, 'testTag', 'Test NAPI 2 + 3 = %{public}d', OCCTRender.add(2, 3));
}) })
// XComponent({ }
// id: this.displayContrId, XComponent({
// type: 'surface', id: this.displayContrId,
// controller: this.displayController type: 'surface',
// }) controller: this.displayController
// .onLoad(() => { })
// // 获取 native window必须在 onLoad 后才能获取) .onLoad(() => {
// this.nativeWindow = this.displayController.getXComponentSurfaceId(); // 获取 native window必须在 onLoad 后才能获取)
// if (this.nativeWindow === undefined || this.nativeWindow === '') { this.nativeWindow = this.displayController.getXComponentSurfaceId();
// hilog.error(0x0000, 'ModelView', 'Failed to get native window'); if (this.nativeWindow === undefined || this.nativeWindow === '') {
// return; hilog.error(0x0000, 'ModelView', 'Failed to get native window');
// } return;
// // 获取 XComponent 尺寸 }
// let width = 0; // 获取 XComponent 尺寸
// let height = 0; let width = 0;
// try { let height = 0;
// //OCCTRender.initRenderer(this.displayContrId, this.nativeWindow, { width: 800, height: 600 }); try {
// console.info('Init Render Good'); OCCTRender.initRenderer(this.displayContrId, this.nativeWindow, { width: 800, height: 600 });
// }catch(e){ console.info('Init Render Good');
// console.info('Init Render Faile'); }catch(e){
// } console.info('Init Render Faile');
// }) }
// .onDestroy(() => { })
// // 销毁时清理资源 .onDestroy(() => {
// //OCCTRender.destroyRenderer(this.displayContrId); // 销毁时清理资源
// }) OCCTRender.destroyRenderer(this.displayContrId);
// .onTouch((event) => { })
// // 简单鼠标/触摸拖拽旋转 .onTouch((event) => {
// if (event.type === TouchType.Move) { // 简单鼠标/触摸拖拽旋转
// const dx = event.tiltX; if (event.type === TouchType.Move) {
// const dy = event.tiltY; const dx = event.tiltX;
// //occt.onMouseEvent(this.xcomponentId, dx, dy); const dy = event.tiltY;
// } //occt.onMouseEvent(this.xcomponentId, dx, dy);
// }) }
// .width('100%') })
// .height('100%') .width('100%')
// .backgroundColor('#333333'); .height('100%')
.backgroundColor('#333333');
} }
.width('100%') .width('100%')
.height('100%'); .height('100%');