繁体   English   中英

如何在Raspberry Pi中使用JNI GPIO本机库编译和运行Java程序

[英]How to compile and run Java program with JNI GPIO native library in Raspberry pi

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

他在c ++中创建了一些端口方法(open,write,close),并使用JNI库与基于Java的程序建立了桥梁。在这种情况下,我们可以使用c ++本机库通过Java与嵌入式卡进行通信( JNI)桥。

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

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

他创建了Java主类和一个用c ++编写的库。我们能够使用Netbeans ide将该库添加到Java主程序中。

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

在这种情况下,只要禁用c ++Jnı库命令,我的java(include javafx)程序就可以在树莓派上正常运行。

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

Netbeans整体构建良好,但是当我在Raspberry或PC中运行这些代码时,它给我一个错误

java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl。)上的java.lang.reflect.Method.invoke(Method.java:497)在com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) java:328)位于sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) .reflect.Method.invoke(Method.java:497),位于sun.launcher.LauncherHelper $ FXHelper.main(LauncherHelper.java:767),原因:java.lang.UnsatisfiedLinkError:期望库的绝对路径:/ 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)at 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

您可以使用此库http://pi4j.com,它支持I2C通信。

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

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

您是否已检查路径差异?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM