0

JAVA クラスからネイティブ メソッドを呼び出そうとしています。この Java クラスは、コンパイルして [.h] バージョンを作成した後、[.c] ファイル内のすべての定義を詳細に説明します。次のステップでは、JAVA クラスでロードした [.dll] ファイルを作成しました。静的パラメーター内。

プログラムを実行しようとすると、次のエラーが表示されます。

スレッド「メイン」の例外 java.lang.UnsatisfiedLinkError: sample.HelloWorld.print()V

Java プログラムからネイティブ メソッドをマップする方法がわかりません。

コードによる詳細な説明:

[print()] メソッド宣言と呼ばれるネイティブ メソッドを持つ [HelloWorld.java] クラス ファイルがあります。

package sample;
public class HelloWorld{
    public native void print();
    static{
        System.loadLibrary("HelloWorld");
    }
}

さて、コンパイル時に、[.class] ファイル バージョンを取得します。次に、次のようにネイティブ メソッド [print()] の定義を持つ [.h] および [.c] ファイルを作成しました。

HellWorld.c

#include<stdio.h>
#include<jni.h>
#include<windows.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv * env, jobject jobj){
          printf("Hello there!!!!!!");
          return;          
  }

この [.c] ファイルをビルドすると、必要な [.dll] ファイルが生成されます。すべてがエラーなしで正常に動作し、JAVA ファイルを呼び出すとメッセージが print() メソッドから出力されます。

主な問題は、別のクラスであるInvoker.javaクラスファイルからHelloWorld.javaクラス ファイルでこのprint()メソッドを呼び出そうとしたときに発生します。次に、これにより例外が生成されます。

スレッド「メイン」の例外 java.lang.UnsatisfiedLinkError: sample.HelloWorld.print()V

なぜこれが起こるのかわかりません。助言がありますか?

4

1 に答える 1

0

.c ファイル内の JNICALL 関数名は、HelloWorld.h ファイル内の名前と正確である必要があります。

詳細については、このリンクを参照してください

于 2014-09-22T03:15:09.810 に答える