jsbind--二进制包导入指导

jsbind--二进制包导入指导

HarmonyOS
2024-05-26 17:45:52
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
单花红丝线

获取二进制包

jsbind-1.1.6.tgz

entry或者featrue本地集成jsbind har包

添加依赖

将压缩包文件拷贝至项目中,例如路径:NativeDemo/jsbindtest

执行安装操作

修改cmakelist

NativeDemo/jsbindtest/src/main/cpp/CMakeLists.txt

IDE400版本配置

IDE400开启了ohpm后,路径发生变化。

# the minimum version of CMake. 
cmake_minimum_required(VERSION 3.4.1) 
project(NativeDemo) 
set(CMAKE_CXX_STANDARD 17) 
  
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 
  
include_directories(${NATIVERENDER_ROOT_PATH} 
                    ${NATIVERENDER_ROOT_PATH}/include) 
  
  
## 源码引入 
# add_subdirectory(jsbind) 
# add_library(jsbindtest SHARED jsbindtest.cpp) 
# target_link_libraries(jsbindtest PUBLIC jsbind) 
  
## 依赖引入 
set(JSBIND_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules/@ohos/jsbind) 
set(CMAKE_MODULE_PATH ${JSBIND_ROOT_PATH}) 
find_package(JSBind REQUIRED) 
add_library(jsbindtest SHARED jsbindtest.cpp) 
target_link_libraries(jsbindtest PUBLIC JSBind::libjsbind) 

IDE400之前版本配置

## 依赖引入 
set(JSBIND_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../node_modules/@ohos/jsbind) 
set(CMAKE_MODULE_PATH ${JSBIND_ROOT_PATH}) 
find_package(JSBind REQUIRED) 
## libjsbindtest.so 
add_library(jsbindtest SHARED jsbindtest.cpp) 
target_link_libraries(jsbindtest PUBLIC JSBind::libjsbind)

js引入

// 引入so 
import testnapi from 'libjsbindtest.so' 
  
@Entry 
@Component 
struct Index { 
  
  build() { 
    Row() { 
      Column() { 
        Text(`js调用cpp`) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let ret = testnapi.jsCallCpp(123) 
            console.log('testTag ret = ' + ret) 
          }) 
        Text(`cpp调用js(注册js callback)`) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            testnapi.cppCallJS((data)=>{ 
              console.log('testTag data = ' + data) 
            }) 
            let callback = function (a:number,b:string) { 
              console.log(`testTag callback a = ${a}, b = ${b}`) 
            } 
          }) 
        Text(`js侧注册函数至C++侧`) 
          .fontSize(50) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let jsFunctionTest = function (a:number,b:string) { 
              console.log(`testTag callback a = ${a}, b = ${b}`) 
            } 
            testnapi.JSBind.bindFunction("jsFunctionTest",jsFunctionTest); 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
} 

C++引入

// jsbind头文件 
#include <jsbind/jsbind.h>  
#include <string> 
  
// 模拟业务逻辑 
static int add(int a,int b) { 
    return a + b; 
} 
  
std::string jsCallCpp(int reason){ 
    // reason为js传递来的入参 
    add(reason,1); 
    auto jsFunc = Jsb::JSBind::GetJSFunction("jsFunctionTest"); 
    if(jsFunc) { 
        jsFunc->Invoke<void>( 1,"hello"); 
    } 
    return "返回值:js调用cpp成功"; 
} 
  
void cppCallJS(Jsb::Callback<void (std::string)> callback){ 
    // callback:js的回调函数 
    callback("入参:cpp回调js成功"); 
} 
  
// jsbind作用域 
JSBIND_GLOBAL(){ 
    // 绑定 C++ 函数,可从 JavaScript 直接调用,函数名一致。 
    JSBIND_FUNCTION(jsCallCpp); 
    JSBIND_FUNCTION(cppCallJS); 
} 
// 注册Native 插件,插件名与CMakeLists.txt中add_library保持一致。 
// ets侧使用  import addon from 'libjsbindtest.so' 
JSBIND_ADDON(jsbindtest)

报错汇总

问题:xxxx 86_64 xxxxx报错

由于某些Hvigor工具默认会编译x86的文件,而当前二进制文件不含x86的文件。

解决 修改build-profile.json5文件

build-profile.json5文件中添加如下配置:

"abiFilters": ["arm64-v8a","armeabi-v7a"]

Har包直接集成jsbind so

由于har包不能本地集成har包,所以har包需要采用集成so的形式。

将har中的include、libs、FindJSBind.cmake拷贝至NativeDemo/library/src/main/cpp中。

修改CMakeLists.txt

# the minimum version of CMake. 
cmake_minimum_required(VERSION 3.4.1) 
project(myNpmLib) 
  
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 
  
include_directories(${NATIVERENDER_ROOT_PATH} 
                    ${NATIVERENDER_ROOT_PATH}/include) 
  
  
## 依赖引入 
set(JSBIND_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) 
set(CMAKE_MODULE_PATH ${JSBIND_ROOT_PATH}) 
find_package(JSBind REQUIRED) 
add_library(library SHARED npmlib.cpp) 
target_link_libraries(library PUBLIC JSBind::libjsbind)
分享
微博
QQ
微信
回复
2024-05-27 22:33:15
相关问题
HarmonyOS 二进制转16进制
72浏览 • 1回复 待解决
HarmonyOS 十进制二进制方法
90浏览 • 1回复 待解决
如何对二进制进行AES解密?
287浏览 • 1回复 待解决
如何直接加载二进制流的图片?
2832浏览 • 1回复 待解决
native层如何访问rawfile的二进制文件
1952浏览 • 1回复 待解决
HarmonyOS gzip二进制流压缩和解压缩
846浏览 • 1回复 待解决