2

JNI 呼び出し API を使用して何かをコーディングしています。AC プログラムは JVM を起動し、JVM を呼び出します。JNIenv ポインターは、C ファイルに対してグローバルです。特定のクラスの jobject に対して同じ操作を実行する必要がある多数の C 関数があります。そこで、jobject を受け取って処理し、必要なデータ (C データ型 ... たとえば int ステータス値) を返すヘルパー関数を作成しました。C ヘルパー関数を作成し、それらに引数として jobject を渡すことは安全ですか?

すなわち(簡単な例 - 質問を説明するために設計されています):

int getStatusValue(jobject jStatus)
{
  return (*jenv)->CallIntMethod(jenv,jStatus,statusMethod);
}

int function1()
{
  int status;
  jobject aObj = (*jenv)->NewObject
    (jenv,
     aDefinedClass,
     aDefinedCtor);

  jobject j = (*jenv)->CallObjectMethod
    (jenv,
     aObj,
     aDefinedObjGetMethod)

  status = getStatusValue(j);

  (*jenv)->DeleteLocalRef(jenv,aObj);
  (*jenv)->DeleteLocalRef(jenv,j);

  return status;

} 

ありがとう。

4

2 に答える 2

0

すべての jni オブジェクトは、ネイティブ メソッドが戻るまで有効です。2 つの jni 呼び出しの間に非グローバル jni オブジェクトを保存しない限り、すべてが機能するはずです。
jni 関数の呼び出しは、次のように機能する必要があります。

  1. Java 関数呼び出し
  2. ネイティブ ローカル参照を作成する
  3. ネイティブ関数を呼び出す
  4. あなたのことをする
  5. ネイティブ関数を終了する
  6. 既存のローカル参照を解放する
  7. ジャバに戻る

ステップ 4 には任意のコードを含めることができます。ローカル参照は、前にリリースされていない場合、ステップ 6 まで有効なままです。
ネイティブ Java 関数への 2 つの呼び出しの間に c 側に jni オブジェクトを格納する場合は、グローバル参照を作成して後で解放する必要があります。グローバル参照を解放しないと、ガベージ コレクターが関連する Java オブジェクトを解放できないため、メモリ リークが発生します。

于 2010-04-29T06:25:20.843 に答える
0

私はJNIの詳細に精通していませんが、一度気づいたことは次のとおりです。

return (*jenv)->CallIntMethod(jenv,jStatus,statusMethod);

これは公式の JNI コードのように見えjobect、パラメーターとして a を使用しています。JNI で機能する場合、コードで機能しない理由はありません。

于 2010-04-29T06:06:16.310 に答える