1

Java で JNI をテストすると、次の明示的なエラーが発生します。

Exception in thread "main" java.lang.UnsatisfiedLinkError: Italk2learn.hello()V
    at Italk2learn.hello(Native Method)
    at Italk2learn.main(Italk2learn.java:10)

my Java クラスの静的コードがうまく機能するため、dll またはパスに問題はありません。

static {
        try {
            System.loadLibrary("Italk2learn");
        } catch (Exception e) {
            System.err.println(e);
            System.exit(1);
        }
    }

そして、ライブラリはうまくいくと思います。

JVM 32 ビットを使用してコンパイルし、C++ ヘッダー (javah) と C++ 用の MinGW32 を取得します。どちらの場合も、C++ と Java には eclipse を使用します。

これは私のコードです:

ジャワ:

public class Italk2learn {

    public native void hello();

    public static void main(String[] args) {
        System.out.println("Hello World Java!");
        try {
            new Italk2learn().hello();
        } catch (Exception e) {
            System.err.println(e);
            System.exit(1);
        }
    }
    static {
        try {
            System.loadLibrary("Italk2learn");
        } catch (Exception e) {
            System.err.println(e);
            System.exit(1);
        }
    }
}

C++ :

#include <jni.h>
#include <stdio.h>
#include "italk2learn.h"

JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
    printf("Hello World C++!\n");
#ifdef __cplusplus
    printf("__cplusplus is defined\n");
#else
    printf("__cplusplus is NOT defined\n");
#endif
    return;
}
4

2 に答える 2

3

C++ でコンパイルしている場合はextern "C"、コンパイラが独自のマングリングを適用しないように、JNI メソッドを次のようにラップする必要があります。

extern "C" {
    JNIEXPORT void JNICALL Java_Italk2learn_hello(JNIEnv *, jobject) {
        // ..
    }
}

参照: http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/design.html#wp224

于 2013-07-30T18:16:40.167 に答える