1
class HelloWorld {
    public native void print();  //native method
    static   //static initializer code
    {
        try{
            String path = System.getProperty("java.library.path");
            System.out.println(path);
        System.loadLibrary("CLibHelloWorld1");
        //System.load("C:/TE_CDA_Project/Test/native/CLibHelloWorld1.dll");
        //Runtime.getRuntime().load("C:/TE_CDA_Project/Test/native/CLibHelloWorld1.dll");

    System.out.println("Loaded CallApi");
    }catch(UnsatisfiedLinkError e){
        e.printStackTrace();
    }
}

public static void main(String[] args)
{
    HelloWorld hw = new HelloWorld();

    hw.print();


}

}

出力:

C:\TE_CDA_Project\Test\native
Loaded CallApi
Exception in thread "main" java.lang.UnsatisfiedLinkError: Graph.HelloWorld.print()V
    at Graph.HelloWorld.print(Native Method)
    at Graph.HelloWorld.main(HelloWorld.java:26)
4

3 に答える 3

1

これをCコンパイラの追加オプションに追加してください。

   -Wl,--export-all-symbols -Wl,--add-stdcall-alias
于 2016-11-15T14:55:16.853 に答える
0

エラーは、次のようなメソッドを呼び出そうとしたことを示しています。

void native print();

で宣言されGraph.HelloWorldていますが、JVM はそのメソッドのネイティブ コード実装を見つけることができませんでした。

これは、いくつかの原因で発生する可能性があります。

  • アプリケーションがSystem.loadLibrary(...)ネイティブ ライブラリをロードしていません。

  • Graph.HelloWorldロードしたネイティブ ライブラリは、クラスのメソッドの名前とシグネチャに一致するメソッドを宣言していません。(クラス名、メソッド名、引数の型、または結果の型が間違っている可能性があります。)


私はあなたの注意を払っていますGraph.HelloWorldが、重大な Java スタイル違反です。それがパッケージ名であると仮定するとGraph、すべて小文字にする必要があります。さらに、(「破棄」コード以外の場合) パッケージ名の前に逆ドメイン名を付けるという慣習に従うことをお勧めします...これにより、「グラフ」パッケージが誤って他の誰かのパッケージと衝突することはありません。

于 2013-05-14T11:06:04.817 に答える