【发布时间】: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