mac环境下nebula-java client读取数据时无法调用jni接口

  1. 问题描述:
    通过storageClient去scan vertex和edge数据时,报错:Method threw ‘java.lang.UnsatisfiedLinkError’ exception.

  2. 问题原因:
    报错入口方法为 Processor.process(spaceName, response),该方法内需要创建RowReader对象,该对象调用JNI接口,需要加载动态链接库 NativeUtils.loadLibraryFromJar("/libnebula_codec.so", NebulaCodec.class),但我链接时失败。

查看本地mvn仓库中~/com/vesoft/nebula/nebula-utils.jar包中的so文件, 通过"file libnebula_codec.so" 查看文件信息,发现该so文件在mac机器上无法使用。

目前nebula不支持mac环境下运行。

  1. 解决:见三楼回复
2 个赞

refer to spark reader 运行报错

1 个赞

由于java-client读取数据需要调用编解码的动态链接库nebula_codec,而在maxos环境下是无法应用github源码中的libnebula_codec.so(因为该库是在linux下打成的),所以想要在mac下带用需要重新在mac环境中编译出动态链接库。
步骤:
一、 拉取nebula最新代码,上面已经更新了cmakeList
二、 安装cmake、glog、gflags、gtest 安装过程参考 spark reader 运行报错 - #5,来自 jude-zhu 帖子中@jude-zhu小姐姐的回复。
三、 在mac下编译nebula_codec。 进入nebula源代码的nebula/src/jni目录下:
• mkdir build && cd build
• cmake …
• make java_lib
编译好之后在build/src中会生成 libnebula_codec.dylib文件,该文件便是mac下的动态链接库。
1878A893-C2DB-482B-852A-DC8FA8FABCCF
四、 编译nebula-util jar包
由于java-client依赖nebula-util包进行数据编解码,所以需要重新编译打包nebula-util,目的是将libnebula_codec.dylib打到nebula-util的jar包中。

  1. 进入nebula源代码的nebula/src/jni/java目录下,修改当前目录下pom.xml中动态链接库名称(后面在编译库时可以统一生成的动态库的后缀名,就不用改代码了)
  2. 修改NebulaCodecResourceLoader.java文件中的NEBULA_LIB_NAME名
public class NebulaCodecResourceLoader {
    private static final String NEBULA_LIB_NAME = "/libnebula_codec.dylib";
    private static final Logger LOGGER = LoggerFactory.getLogger(NebulaCodec.class.getName());
  1. 在当前目录下执行maven打包命令
    mvn clean package

打包结束后会在nebula/src/jni/java/target目录下生成nebula-utils-1.0.0-rc4.jar

  1. 之后在 nebula/src/jni/java/target 目录下执行以下命令,将jar包install到maven私服仓库。
    mvn install:install-file -Dfile=nebula-utils-1.0.0-rc4.jar -DgroupId=com.vesoft -DartifactId=nebula-utils -Dversion=1.0.0-rc4 -Dpackaging=jar

五、 修改java-client中的动态库名并打包

  1. 修改RowReader.java中的动态库名
    NativeUtils.loadLibraryFromJar("/libnebula_codec.dylib", NebulaCodec.class);

  2. 修改java-client的pom中nebula-utils依赖包的版本,修改为第3.4步打出来的nebula-utils-1.0.0-rc4.jar的版本

  3. 在java-client目录下maven打包
    mvn clean compile package

====这样就可以在maxos下调用java-client了。

1 个赞

您好,your-nebula-utils.jar 这个在哪生成的

按照这个执行就会生成了

这个jar是在nebula源代码的nebula/src/jni/java目录下 执行

mvn install:install-file -Dfile=your-nebula-utils.jar -DgroupId=com.vesoft -DartifactId=nebula-utils -Dversion=1.0.0-rc4 -Dpackaging=jar

生成的。 生成的jar包在nebula/src/jni/java/target中

这个命令的目的是生成nebula-utils-1.0.0-rc4.jar

image
这个用的又是nebula-utils-1.0.0-rc4.jar

我执行完以下命令时候这个文件就生成了

执行完 make命令后生成的jar包是未改动态链接库的包,没法在mac下使用的,这一步目的是在mac下生成新的动态库文件。

你看下帖子我加了个mvn clean package的步骤,这一步目的是打成nebula-utils-1.0.0-rc4.jar,

mvn install目的是将jar包安装到maven本地仓库,这样在nebula-client中才能引入该包的依赖。

1 个赞

按这个步骤来执行,出现错误,请指点下

看了下报错,定位是需要需java对应目录找jni文件,我的java没有include文件,是需要专门特殊添加吗

你咋安装的java,一般安装了都是有这个头文件的

我的java没有include文件,是需要专门特殊添加吗

必须要有的,没有的话,你重装下呗

就正常下载jdk dmg安装的啊,我重装试下