2016-10-27 1 views
0

J'essaie d'exécuter du code java sur un Raspberry Pi modèle 3, téléchargé à partir d'un environnement de développement PC eclipse pour accéder à un périphérique 9DoF sur le bus I2C en utilisant la bibliothèque pi4j. Je reçois l'erreur suivante:

java -classpath .:classes:/opt/pi4j/lib/'*' -jar /home/pi
/artifacts/RPITank-1.0-SNAPSHOT.jar Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.NoClassDefFoundError: com/pi4j/io/i2c/I2CFa
ctory$UnsupportedBusNumberException at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) at java.lang.Class.privateGetMethodRecursive(Class.java:3048) at java.lang.Class.getMethod0(Class.java:3018) at java.lang.Class.getMethod(Class.java:1784) at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544 ) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) Caused by: java.lang.ClassNotFoundException: com.pi4j.io.i2c.I2CFactory$Unsuppor
tedBusNumberException at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 7 more

Voici le code

package main; 

import java.io.IOException; 

import com.pi4j.io.gpio.GpioController; 
import com.pi4j.io.gpio.GpioFactory; 
import com.pi4j.io.i2c.I2CBus; 
import com.pi4j.io.i2c.I2CFactory; 

import devices.I2C.Pi4jI2CDevice; 
import devices.sensorImplementations.MPU9250.MPU9250; 

public class MPU9250Test { 

    public static void main(String[] args) 
    { 
     I2CBus bus = null; 
     System.out.println("Attempt to get Bus 1"); 
     try { 
      final GpioController gpio = GpioFactory.getInstance(); 
      bus = I2CFactory.getInstance(I2CBus.BUS_1); 
      System.out.println("Got Bus, create devices"); 
      MPU9250 mpu9250 = new MPU9250(
        new Pi4jI2CDevice(bus.getDevice(0x68)), // MPU9250 I2C device 
        new Pi4jI2CDevice(bus.getDevice(0x0C)), // ak8963 I2C 
        100,         // sample rate 
        100);         // sample size 
      Thread sensor = new Thread(mpu9250); 
      sensor.start(); 

      Thread.sleep(10000); 

      sensor.interrupt(); 

      for(int i = mpu9250.getAccelerometerReadingCount() -1; i>0; i--) 
      { 
       System.out.print("G: " + mpu9250.getRotationalAcceleration(i).toString()); 
       System.out.print(" A: " + mpu9250.getAcceleration(i).toString()); 
       System.out.println(" M: " + mpu9250.getGaussianData(i).toString()); 
      } 
     } catch (I2CFactory.UnsupportedBusNumberException | InterruptedException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

J'ai vérifié que l'appareil est visible sur le bus 1 en utilisant I2Cdetect -y 1, cela montre un dispositif à l'adresse 0x68 et 0x76 .

Je ne sais pas s'il s'agit d'un problème avec l'environnement d'exécution ou le code, toute aide serait la bienvenue.

D'autres expérimentations montrent que la suppression du gestionnaire d'exceptions n'est pas une option requise lors de la compilation. La classe d'exception est décrite ici http://pi4j.com/apidocs/com/pi4j/io/i2c/I2CFactory.UnsupportedBusNumberException.html

+0

Causée par: java.lang.ClassNotFoundException: com.pi4j.io.i2c.I2CFactory $ Unsuppor tedBusNumberException - Vérifiez que vous avez cette classe dans votre chemin de classe – gile

+0

java -classpath.: classes:/opt/pi4j/lib/'*' -jar/home/pi cela inclut les bibliothèques pi4j – gjwo

+0

Le fichier .pom du projet Eclipse et le fichier RPi ont été mis à jour pour utiliser pi4j 1.2-SNAPSHOT, cela n'a eu aucun effet sur le résultat. – gjwo

Répondre

1

Le problème est que le pot de projet lors de son transfert à la Raspberry Pi ne captait pas ses liens d'exécution au logiciel pi4j pré-installé sur l'IPD le problème a été résolu par an issue on github here grâce à natdan.

Les modifications apportées au pom.xml du projet sont les suivants:

Ajouter la dépendance du temps d'exécution des dépendances

<dependencies> 
<dependency> 
    <groupId>com.pi4j</groupId> 
    <artifactId>pi4j-core</artifactId> 
    <version>1.2-SNAPSHOT</version> 
</dependency> 
<dependency> 
    <groupId>com.pi4j</groupId> 
    <artifactId>pi4j-native</artifactId> 
    <version>1.2-SNAPSHOT</version> 
    <classifier>raspberrypi-dynamic</classifier> 
    <type>so</type> 
</dependency> 

Après une expérimentation plus poussée il est apparu que cette dépendance était pas nécessaire après tout, alors ignorez la section ci-dessus.

Le chemin de classe a ensuite été ajouté à la configuration du plugin Jar Maven comme entrée manifeste:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>3.0.2</version> 
      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <!--<classpathPrefix>${pi.pi4j.Directory}/</classpathPrefix>--> 
         <mainClass>${pi.main.class}</mainClass> 
        </manifest> 
        <manifestEntries> 
         <!-- Add the pi4j in runtime. --> 
         <Class-Path>${pi.pi4j.Directory}/pi4j-core.jar</Class-Path> 
        </manifestEntries> 
       </archive> 
      </configuration> 
     </plugin> 

enfin le chemin de classe a été retiré de la commande java dans la section antrun

      <!-- run the JAR file on the Raspberry Pi --> 
          <sshexec host="${pi.host}" port="${pi.port}" username="${pi.user}" 
           password="${pi.password}" trust="true" failonerror="false" 
           verbose="true" 
           command="java -jar ${pi.deployDirectory}/${project.build.finalName}.jar" /> 
+0

La partie '' a résolu mon problème en particulier, merci! – Loek