2010-12-03 14 views
4

を返します。AndroidRuntime :: getJNIEnv()私はJNI部に以下のコードを持っているNULL

JNIEnv* env = AndroidRuntime::getJNIEnv(); 

上記の文は、常に私の機能にNULLを返します。次に、envを使い、コールバック機構を使ってJavaコードでいくつかのメソッドを呼び出します。

getJNIEnv()のコードのこの部分は、常にNULLを返します。

if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) 
{ 
     return NULL; 
} 

誰でもコードに間違いがありますか教えてください。 JNIの他の関数もほとんど同じような実装をしているので、私はかなり普通に見えます。

答えて

7

まず、AndroidRuntime::getJNIEnv()を使用しないでください。これはNDK APIの一部ではありません。代わりに、JNI GetEnv関数を使用する必要があります。

第2に、GetEnvは、現在のスレッドがVMに接続されていない場合はNULLを返します。 (JNIEnvはスレッド固有であることを覚えておいてください。)スレッドを自分で作成した場合は、JNI AttachCurrentThread関数を使用してスレッドを追加する必要があります。

これらの両方にポインタJavaVMが必要です。あなたはまだしていない場合は、渡されたJNIEnvを持っているときにJNI_OnLoadまたはあなたのプログラムからセットアップコール(GetJavaVM機能)の間にそれを得ることができるので、一つだけこれらあたりのプロセスのあります。

JNI Tipsページを読んで(いくつかの包括的なJNIドキュメントへの参照を含んでいます)。

関連する問題