2012-02-03 14 views
2

私は、次の操作を実行しようとしている(私は何かが欠けてるかどうかわからないか、これが不可能な場合):はJNI、Mulithreadingと呼び出し方法

私は、この特定のケースサーブレットで(Javaクラスを持っています)はネイティブメソッドを呼び出します。

このネイティブメソッドでは、私は新しいスレッドを生成しています。そのスレッドでは、そのJavaオブジェクトに対してメソッドを呼びたいと思います。それも可能ですか?

元のスレッドと呼ばれるネイティブメソッドで試したことは、JavaVMインスタンスを覚えておいて、後で他のスレッドを追加することができます(動作しそうです)。 jobject:

JavaVM *vm; 
env->GetJavaVM(&vm); 

env->NewGlobalRef(jobj) 

私が知りませんが、他のスレッドでjobjectを取得する方法です。私はそれを渡す場合、VMがクラッシュ、私は違法なスレッドアクセスのために仮定します。クラスのための新しいオブジェクトを作成する場合、私は必要な正確なオブジェクトを持っていないでしょう。

アイデア?

ありがとう、 マーク

いくつかの追加CODE(メソッド名などは隠さ):

The method that is called from the servlet: 

JNIEXPORT jstring JNICALL ABC (JNIEnv *env, jobject jobj, some more arguments 
{ 
    JavaVM *vm; 
    env->GetJavaVM(&vm); 
    env->NewGlobalRef(jobj); 

    // spawning new thread (I'm using boost libraries) 
    boost::thread t = boost::thread(boost::bind(&XYZ::DEF, instance of XYZ, vm, &jobj); 
    ... 
} 

void XYZ::DEF(JavaVM* vm, jobject* jobj) 
{ 
    JNIEnv* env; 
    vm->GetEnv((void**)&env, JNI_VERSION_1_2); 
    vm->AttachCurrentThread((void**)&env, NULL); 
    ... then eventually calling another method, but still the same thread, where I'm doing this: 

jobject bb = env->NewDirectByteBuffer(...,...); // this crashed when I just used the env from the original thread, seems to work since I'm attaching the second thread to the VM. 

// it crashes somewhere during the following code: 
jclass cls = env->GetObjectClass(jobj); 
jmethodID mid = env->GetMethodID(cls, "callback", "(I)V"); 
env->CallVoidMethod(jobj, mid, 13); 

クラッシュは、この「致命的なエラーがJREによって検出されたようなものを作り出します...問題のあるフレーム:V [libjvm.so + 0x3e9220] ...

+0

あなたはAttachCurrentThreadを呼び出していて、返されたenvポインタを使用していますか? – mcnicholls

+0

@mcnicholls:はい。その後、元のスレッドから思い出したjobjectインスタンスを使用してGetObjectClassを実行します。これは、Env-> CallVoidMehtod(jobj、...)を実行するときにも使用しています。ここで、envはAttachCurrentThreadを呼び出すときに返されたものです。 – Mark

+0

もっとコードを表示できますか?あなたがしていることは正しいと思います。グローバル参照は、削除するまで、どのスレッドでも使用できます。 –

答えて

3

あなたはNewGlobalRefの結果を無視しているように見えますが、代わりに元jobjの他のスレッドにその結果を使用する必要が

+0

それはそれでした。ありがとうございました! – Mark

関連する問題