1

こんにちは、私は JNI の初心者で、Eclipse を使用して単純な JNI の例を動作させようとしています。次のチュートリアルの手順に従いました: http://codeandme.blogspot.com/2011/09/jni-made-easy.html 私の Java コードは次のとおりです。

public class Main 
{
    private native int getDouble(int n);
    public static void main(String[] args)
    {
        System.load("/home/ryan/Desktop/libJNILibrary3.so");
        Main m = new Main();
        System.out.println(m.getDouble(3));
    }
 }

次に、jdk1.7.0_11/bin に含まれる javah ツールを使用して、ヘッダー ファイルを生成しました。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Main */

#ifndef _Included_Main
#define _Included_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Main
 * Method:    getDouble
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_Main_getDouble
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif

次に、Eclipse で C++ プロジェクトを作成し、Main.cpp ソース ファイルを作成しました。Main.cpp と同じフォルダーに Main.h ファイルを配置しました。Main.cpp のコードは次のとおりです。

#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_getDouble
  (JNIEnv *env, jobject obj, jint n)
{
    return n*2;
}

次に、プロジェクトのビルド設定を構成するためのチュートリアルの指示に従いました。プロジェクトをビルドすると、「.so」ファイル「libJNILibrary3.so」が作成されました。次に、Java クラス「Main」を実行したところ、次のエラーが発生しました。

Exception in thread "main" java.lang.UnsatisfiedLinkError: Main.getDouble(I)I
    at Main.getDouble(Native Method)
    at Main.main(Main.java:9)

奇妙なことに、この例をやり直して、getDouble メソッドが引数を取らず、単に値 2 を返すようにすると、すべてが正常に機能します。メソッドに引数を取らせると、どういうわけかすべてが台無しになります。このエラーに 10 時間以上費やし、多くのフォーラムを検索しましたが、この問題の解決策は見つかりませんでした。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

関数の本体をcppファイルに配置し、JNIコールバックはCスタイルの名前マングリングに従う必要があります。

cppファイルでこれを試してください:

extern "C"
{

JNIEXPORT jint JNICALL Java_Main_getDouble
  (JNIEnv *env, jobject obj, jint n)
{
    return n*2;
}

}
于 2013-01-30T21:57:36.467 に答える