2016-10-27 10 views
0

PCのEclipse開発環境からダウンロードしてpi4jライブラリを使用してI2Cバス上の9DoFデバイスにアクセスするRaspberry Piモデル3でJavaコードを実行しようとしています。私は次のエラーを取得する:

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

これは私がデバイスがI2Cdetect -y 1を使用してバス1の上に表示され、これはアドレス0x68と0x76でデバイスが表示されていることを確認したコード

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(); 
     } 
    } 

} 

です。

これは実行環境やコードに問題があるかどうかわかりませんが、どんなヘルプも歓迎します。

さらなる実験では、例外ハンドラを削除することはコンパイル時に必要となるオプションではないことが示されています。例外クラスには問題はラズベリーパイに転送し、プロジェクトのjarファイルは問題がnatdanにan issue on github here感謝を経由して解決したRPIにプリインストールされているpi4jソフトウェアへの実行時のリンクを拾っていなかったということでしたここ http://pi4j.com/apidocs/com/pi4j/io/i2c/I2CFactory.UnsupportedBusNumberException.html

+0

でjavaコマンドから削除させた:

クラスパスは、次に、マニフェストエントリとしてMavenのジャーのプラグインの設定に加えました。 java.lang.ClassNotFoundException:com.pi4j.io.i2c.I2CFactory $ Unsuppor tedBusNumberException - クラスパスにそのクラスがあることを確認してください。 – gile

+0

java -classpath。classes:/ opt/pi4j/lib/'*' -jar/home/piこれにはpi4jライブラリが含まれています – gjwo

+0

Eclipseプロジェクトの.pomファイルとRPiの両方がpi4j 1.2-SNAPSHOTを使用するように更新されましたが、これは結果に影響しませんでした。 – gjwo

答えて

1

記載されています。

次のようにプロジェクトのpom.xmlに加えられた変更は以下のとおりであった:

それはこの依存関係があったことが判明した依存関係にさらなる実験後

<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> 

を実行時の依存関係を追加します。結局必要ではないので、上記のセクションは無視してください。

 <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> 
最終的

クラスパスにより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

''部分は私の問題を特に修正しました!ありがとう! – Loek