【问题标题】:How to compile and run Java program with JNI GPIO native library in Raspberry pi如何在树莓派中使用 JNI GPIO 本机库编译和运行 Java 程序
【发布时间】:2023-03-21 19:52:02
【问题描述】:

我想通知您,一位雇主创建了一个基于 java 的程序,该程序通过 I2C 通信与 Raspberry pi 进行通信。

他在 c++ 中创建了一些端口方法(打开、写入、关闭),并使用 JNI 库与他的基于 java 的程序建立了桥梁。所以在这种情况下,我们可以使用 c++ 通过 java 与嵌入式卡进行通信本机库 (JNI) 桥接器。

所以我们的主程序是用 Java 编写的,并与 c++(JNI) 方法桥接以与 GPIO 通信。

我们正在使用 Raspberry pi 来控制这个嵌入式卡,Java 可以在 Raspberry 上运行。

他创建了主要的 java 类和一个用 c++ 编写的库。我们可以使用 Netbeans ide 将此库添加到 java 主程序中。

最近,这个项目分配给了我,我改进了这个项目并使用 javafx 添加了用户界面。

在这种情况下,只要禁用 c++ Jnı 库命令,我的 java(包括 javafx)程序就可以在 raspberry pi 上运行良好。

当我在我的 java 程序中启用这些 c++ JNI 相关命令时,我无法设置同时运行这些 c++ JNI 代码和我的 java 程序。

Netbeans 一起构建得很好,但是当我在 Raspberry 或 PC 中运行这些代码时它给了我一个错误

java.lang.reflect.InvocationTargetException 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) 在 com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:497) 在 sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 原因:java.lang.UnsatisfiedLinkError: Expecting a absolute path 图书馆: /puttolightfx/RaspberryPINativeCLibrary/dist/Debug/GNU-Linux-x86/libRaspberryPINativeCLibrary.so 在 java.lang.Runtime.load0(Runtime.java:806) 在 java.lang.System.load(System.java:1086) 在 base.RaspberryPINativeJavaLibraryBaseClass.LoadLibrary(RaspberryPINativeJavaLibraryBaseClass.java:30) 在 base.RaspberryPINativeJavaLibraryBaseClass.(RaspberryPINativeJavaLibraryBaseClass.java:19) 在 puttolightfx.SignalLamp.(SignalLamp.java:186) 在 puttolightfx.PutToLightFX.main(PutToLightFX.java:149) ... 11 更多

我的问题是;

1)如何编译这些c++ JNI相关代码并在Raspberry中运行?

基本上我正在使用 scriptshell 来运行这个基于 java 和 javafx 的程序。但是当启用 c++ JNI 时它不起作用。

看起来像这样;

/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java
-Dfile.encoding=UTF-8 -Djava.ext.dirs=/opt/armv6hf-sdk/rt/lib/ext
-Djava.awt.headless=true
-jar /home/root/NetBeansProjects//PutTo/dist/PutTo.jar

【问题讨论】:

    标签: java c++ java-native-interface raspberry-pi


    【解决方案1】:

    你可以使用这个库http://pi4j.com它支持I2C通信。

    【讨论】:

    • 是的,但是我已经完成了我的部分,如果我开始 p4j 案例。我必须根据这个编写所有方法,这需要时间。我只想使用用 C 编写的 ex 代码并与 JNI 桥接。
    【解决方案2】:

    基于堆栈跟踪的这一部分。

    java.lang.UnsatisfiedLinkError:期望库的绝对路径:
    /puttolightfx/RaspberryPINativeCLibrary/dist/Debug/GNU-Linux-x86/libRaspberryPINativeCLibrary.so

    你应该检查图书馆是否在这个位置。

    ldd libRaspberryPINativeCLibrary.so 返回什么?是否可能缺少动态链接库?

    来自堆栈跟踪:

    /puttolightfx/RaspberryPINativeCLibrary/dist/Debug/GNU-Linux-x86/libRaspberryPINativeCLibrary.so

    来自您在评论中的代码

    /projects/puttolightfx/RaspberryPINativeCLibrary/dist/Debug/GNU-Li‌​nux-x86/libRaspberryPINativeCLibrary.so

    你已经检查过路径的不同了吗?

    【讨论】:

    • System.load("/projects/puttolightfx/RaspberryPINativeCLibrary/dist/Debug/GNU-Linux-x86/libRaspberryPINativeCLibrary.so") 我有一个 java 库添加到我的主java程序,在这种情况下,c ++ JNI库与.so文件相关。所以这个文件可以直接在我的主文件中使用。
    猜你喜欢
    • 1970-01-01
    • 2020-01-16
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多