1

次のコードは、JavaからC++メソッドを呼び出すことができます。

JNITest.java

public class JNITest  {
    static {
        System.load("D:\\gagan docs\\TestJava\\Example.dll");
    }

    public native int intMethod(int n);

    public static void main(String[] args) {
        JNITest jnitest = new JNITest();
        int square=jnitest.intMethod(5);
        System.out.println("HelloWorld");
        System.out.println("From init method"+square);
    }

}

Example.cpp

#include "JNITest.h"
#include<string.h>
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num)
{
    return num*num;
}

しかし、以下を使用して上記のCPPからjavaメソッドを呼び出そうとすると、JVMがクラッシュします。

また、createJavaVMメソッドを使用してJVMを作成しようとしましたが、クラッシュしました。

Example.cpp

#include "JNITest.h"
#include<string.h>
static JavaVM *jvm = NULL
JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num) 
{
    JNIEnv* jenv;
    int res = jvm->AttachCurrentThread((void **)&jenv, NULL);
    return num*num;
}

Linux(64ビット)マシンとJDK 64ビット(Java 1.6)を使用しています。

Java-> C++->Javaから完全なフローを作成したいと思います。この問題に関する情報は非常に役立ちます。

4

1 に答える 1

1

C++ から Java を呼び出すことは、(比較的) 簡単なことです。

JNIEXPORT jint JNICALL Java_JNITest_intMethod(JNIEnv *env, jobject obj, jint num)
{
    jint x = (env)->CallIntMethod(obj, method_id);
    // or, (env)->CallVoidMethod(obj, voidMethod, ...), etc.
}

jobjectこれは、 のクラスが で識別されるメソッドを持っていることを前提としていますjmethodID。の取得もjmethodID簡単です。

jclass class_inst = (env)->FindClass("pkg/to/my/stuff/Class");
jmethodID method_id = (env)->GetMethodId(class_inst, "methodName", "()I");

特定のクラスに対して呼び出したいメソッドを取得することは、おそらく最も困難な作業ですが、基礎を十分に理解していれば、まったく難しいことではありません。

良い例 (免責事項: 私は例の作成者です) については、inotify-interface.cppを参照してください。

また、おそらくAttachCurrentThreadを呼び出すことに興味がないことにも注意してください。

于 2012-10-12T17:29:07.960 に答える