1

このエラーについてはかなり多くのことがわかりましたが、どういうわけか提案された解決策のどれも問題を解決しませんでした.

Eclipse の Ubuntu で libgphoto2 に JNA バインディングを使用しようとしています (Eclipse での Java の使用経験は中程度で、Ubuntu ではまったく経験がありません)。私が使用したい問題のバインディングはここにあります: http://angryelectron.com/projects/libgphoto2-jna/

そのページに記載されている手順に従い、上記のエラーで失敗した簡単なテスト クライアントを作成しました。そのため、GPhoto2 オブジェクトをインスタンス化することだけを試みたが、それでもエラーが発生するまで、テスト クライアントを縮小しました。テスト クライアントは次のようになります。

import com.angryelectron.gphoto2.*;

public class test_class 
{
    public static void main(String[] args)
    {
        GPhoto2 cam = new GPhoto2();
    }

}

私が得るエラーはかなり多くのスペースを占めます:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/Structure
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    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)
    at test_class.main(test_class.java:12)
Caused by: java.lang.ClassNotFoundException: com.sun.jna.Structure
    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)
    ... 13 more

libgphoto2 自体がインストールされ、コマンド ラインから実行されます。開発ヘッダーもあり、Python から GPhoto2 関数を呼び出すことができるため、問題はそこにありません。

しかし、Eclipse で .class ファイルを見ると、定義がありませんでした。したがって、特に ant で全体をビルドするときにエラーが発生したため、それが問題である可能性があると考えました (.jar は正常にエクスポートされましたが、エラーはドキュメントの生成のみに関係しているとわかりました)。そこで、ソースを Eclipse にロードし、自分で .jar をビルドしました。このとき、Eclipse はビルド中に警告があったと述べましたが (エラーはありませんでした)、実際の警告は表示されませんでした。誰かがビルドログがどこに行ったのか教えてくれたら、それはすでに何かを助けるかもしれません. 私は成功せずにどこでもそれを検索しました.Eclipseで「詳細」をクリックすると、警告が何であったかではなく、どこで発生したかがわかります。

とはいえ、警告は必ずしも壊滅的なものではないため、結果の Jar を上記のクライアントにインポートしました。.class ファイルを確認したところ、今回はすべてのコードが含まれていました。しかし、それでもまったく同じエラーのリストが表示されます (はい、古いライブラリがクラスパスから削除され、新しいライブラリが追加されたことを確認しました。念のため、このプロセスを数回繰り返しました)。

私は jar を作成した経験がないので、別のプログラムから呼び出すことができるかどうか、または同様のエラーが発生するかどうかを確認するために、小さな helloworld jar を作成しました。問題なく動作しました。さまざまなオプションでエクスポートして、問題を意図的に再現しようとしましたが、それでも機能しました。実験中に機能した設定で実際に必要なライブラリを再エクスポートしようとしましたが、それでも実行されませんでした。私は今ではかなり立ち往生しています。問題の解決に役立つヒントをいただければ幸いです。

4

3 に答える 3

2

@Paul Whelanが言ったことに加えて。不足している jar を直接取得することで、運が良くなる可能性があります。

ここで不足しているライブラリを取得し、クラスパスを設定してからアプリケーションを再実行し、正常に動作するかどうかを確認します。

于 2015-09-23T10:08:00.553 に答える
1

com/sun/jna/Structure を使用している Java のバージョンは、特定の JVM でのみ機能する場合があります。

一般的には、sun などのパッケージです。Java プラットフォームの外部にある . )。太陽への直接呼び出しを含むプログラム。パッケージは 100% Pure Java ではありません。

詳細はこちら

于 2015-09-23T09:57:47.480 に答える
1

jar には、ライブラリの場所をアプリケーションに伝える MANIFEST.MF が必要です。Eclipse でプロジェクトのルート ディレクトリにファイルを作成し、次の行を追加します。

Manifest-Version: 1.0
Class-Path: <PATH_TO_LIB__CAN_BE_RELATIVE>.jar       // e.g Class-Path: ../test.jar
<empty line>

Eclipse でプロジェクトを右クリックし、[エクスポート] ->[次へ]->[次へ]->[次へ]->[ワークスペースから既存のマニフェストを使用] に移動し、それを選択して [完了] をクリックします。これはうまくいくはずです。

もう 1 つの解決策は、Maven を使用してクラスを jar 自体にコンパイルすることです。

于 2015-09-23T10:10:16.967 に答える